多线程:简单程序段故障(核心转储)

时间:2018-03-21 16:54:59

标签: c linux multithreading operating-system

我正在尝试创建一个计算从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);

这是错误: 分段错误(核心转储)

2 个答案:

答案 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;
        }