当超过12个线程时,Pthread_create分段错误?

时间:2012-06-18 17:03:22

标签: c++ multithreading pthreads

我有一个C ++程序,使用t个线程将0到n之间的数字相加。 N和T作为命令行参数传递。我正在使用一个创建pthreads的for循环和一个重新加入main的循环for循环。当我使用少于11或12个线程时,程序执行正常。例如,在输入100 10上,它返回5050.当我使用超过11-12个线程时,它会导致分段错误并崩溃。我似乎无法弄清楚为什么。我的代码中有一些用于调试的行,例如打印到提示符等。任何提示都很感激!

int n = 0;
int t = 0;
unsigned long gsum = 0;
pthread_mutex_t mutexsum;

void *sum(void *Index)
{
    int index = (int)(int *) Index; 
    int threadSum = 0;
    int k;
    int lowerBound, upperBound; //used to find range of numbers to sum

    //printf("I am here: %d \n",index);

    if (index == t - 1) {
        lowerBound = (n/t)*(t-1);
        upperBound = n; 
    } else {
        lowerBound = (n/t)*index;
        upperBound = (n/t)*(index+1)-1;
    }

    for (k = lowerBound; k < upperBound + 1; k++) {
        threadSum = threadSum + k;
    }

    // Critical Section
    pthread_mutex_lock(&mutexsum);
    gsum = gsum + threadSum;
    pthread_mutex_unlock(&mutexsum);    

    pthread_exit((void*) 0);
}
int main(int argc, char* argv[]){
int i, k, j;
pthread_t sumThreads [t];


for(i = 1; i < argc; i++) {
    if(i == 1)
        n = atoi(argv[i]);
    if(i == 2)
        t = atoi(argv[i]);
}

if (n < 0 || t <= 0 || argc != 3) {
    printf("Invalid or missing parameters! \n");
    exit(0); 
}

for (k = 0; k < t; k++) {
    int nt = -1;    
    nt = pthread_create(&sumThreads[k], NULL, sum, (void*)k);
    printf("%d \n", nt);
}

for (j = 0; j < t; j++) {
    int rj = -1;    
    rj = pthread_join (sumThreads[j], NULL);
    printf("%d \n", rj);
}    

printf("Total Sum: %lu \n",gsum);
return 0;

2 个答案:

答案 0 :(得分:3)

您已将t初始化为程序顶部的零,所以此行:

pthread_t sumThreads [t];

没有分配足够大的数组来保存线程标识符。因此,存储标识符时缓冲区溢出,并且正在读取thread_join循环中的缓冲区。

您正在使用名为可变长度数组(或VLA)的功能,该功能在1999年标准修订版中成为C语言的一部分。 C ++尚未采用VLA,因此您使用的是编译器扩展。如果您希望代码符合C ++,则应使用向量。

std::vector<pthread_t> sumThreads;

// ...after t gets initialized
sumThreads.resize(t);

答案 1 :(得分:0)

在c / c ++中,这种类型的代码不起作用:

int i=10:
int arr[i];

避免这样做。如果这种类型的代码有效,我们将不再需要malloc .. 这正是你想要实现的目标。