我正在尝试创建一个计算从1到1000的素数的程序。我相信代码在创建或加入pthreads时遇到了麻烦。我不断收到核心转储错误。我主要担心的是第二个for循环,我加入了pthreads。这是检查线程是否已结束的正确方法吗?
我在终端使用gcc --std = c99 -Wall -Werror -pthread primes.c -o primes。
while (test_val <= FINAL){
//loop to check if thread is finished
for(int i = 0; i < THREADS; i++){
if(tid[i] == 0){
pthread_create(&tid[i], NULL, testprime, NULL);
}
}
//wait for thread to end
for(int i = 0; i < THREADS; i++){
pthread_join(tid[i], NULL);
这是错误: 分段错误(核心转储)
答案 0 :(得分:0)
下面:
for(int l = 0; ti < MAX_THREADS; ti++){
if(tid[l] == 0){
pthread_create(&tid[l], NULL, testprime, NULL);
tid[l] = 1;
}
}
pthread_create
的第一个参数是输出线程句柄。在下一行,您将此值设置为1
(可能将其标记为已使用)。
在这些无效句柄上执行pthread_join
时,您将调用未定义的行为。
删除此分配,线程句柄不是0,所以无论如何你的代码都会正常工作。
答案 1 :(得分:0)
你只需要在这里纠正你的for循环。您不需要在数组中指定值。当你调用pthread_create
时,它会将线程id存储在线程数组的每个位置。
for(int ti = 0; ti < MAX_THREADS; ti++){
if(tid[ti] == 0){
pthread_create(&tid[ti], NULL, testprime, NULL);
//tid[l] = 1;
}