2

作为 pthreads 教程练习的一部分,我编写了一个程序来创建 10 个线程,而不是加入 10 个线程。该程序运行并打印输出,但似乎在第一次调用 pthread_join 时会导致分段错误。我不确定为什么会发生这种情况。我尝试在网上搜索,但大多数问题都与传递给函数的无效指针有关。我不确定这是否与我的代码相同,因为我不容易看到它。

如果有人可以帮助我,我当然会很感激:)

代码如下:

#include <stdio.h>
#include <pthread.h>
#define NTHREADS    10

void *thread_function(void *arg)
{
    int i;
    int *coming = (int*) arg;
    for(i=0; i<5; i++)
        printf("Hello, World (thread %d)\n", *coming);
    return NULL;
}

int main(void)
{
    int i;
    void *exit_status;
    int retVal;
    pthread_t pthread_array[NTHREADS];
    int randVals[10] = {23,5,17,55,9,47,69,12,71,37};

    printf("threads are created\n");
    for(i=0; i<10; i++)
    {
        retVal=pthread_create(&pthread_array[i], NULL, thread_function, &randVals[i]);
        printf("pthread_create %d retVal=%d\n", i, retVal);
    }

    printf("threads are joined\n");
    for(i=0; i<10; i++)
    {
        retVal= pthread_join(pthread_array[i], &exit_status);
        printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
        *((int *)exit_status));
    }

    printf("all threads have ended\n");
    return 0;
}
4

2 回答 2

0

这就是问题

printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
    *((int *)exit_status));

您的线程函数返回 NULL,因此这是存储在exit_status. 所以现在在printf你做这个

*((int *)exit_status

您正在将此 NULL 指针强制转换为 int*,然后取消引用它。取消引用 NULL 指针不是一个好主意。有关如何使用exit_status pthread_join 中的“状态”到底代表什么以及如何查询它的更完整示例,请参阅此问题

于 2012-09-08T21:32:02.160 回答
0
    *((int *)exit_status));

如果线程函数返回 NULL(它确实如此),这将尝试取消引用它。在这样做之前,您应该测试exit_status

pthread_join(...);
if (exit_status != NULL)
    /* Safe to use. */
于 2012-09-08T21:32:08.523 回答