gpt4 book ai didi

c++ - 当超过 12 个线程时,pthread_create 段错误?

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:30 26 4
gpt4 key购买 nike

我有一个 C++ 程序,它使用 t 个线程对从 0 到 n 的数字求和。 N 和 T 作为命令行参数传递。我正在使用一个创建 pthreads 的 for 循环和一个将主线程重新加入它们的第二个 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;

最佳答案

您已在程序顶部将 t 初始化为零,因此这一行:

pthread_t sumThreads [t];

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

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

std::vector<pthread_t> sumThreads;

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

关于c++ - 当超过 12 个线程时,pthread_create 段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11087630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com