pthread_join导致seg故障

pthread_join导致seg故障,join,pthreads,Join,Pthreads,作为pthreads教程练习的一部分,我编写了一个程序来创建10个线程,而不是加入10个线程。程序运行并打印输出,但是在第一次调用pthread_join时,它似乎会导致分段错误。我不知道为什么会发生这种情况。我尝试在web上搜索,但是大多数问题都与传递给函数的无效指针有关。我不确定这是否与我的代码相同,因为我不容易看到它 如果有人能帮助我,我当然会非常感激: 代码如下: #include <stdio.h> #include <pthread.h> #define NT

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

如果有人能帮助我,我当然会非常感激:

代码如下:

#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;
}
这就是问题所在

printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
    *((int *)exit_status));
线程函数返回NULL,因此这是存储在exit_status中的值。所以现在在你的printf中你这样做

*((int *)exit_status
您正在将此空指针强制转换为int*,然后取消对它的引用。取消对空指针的引用不是一个好主意。有关如何使用退出状态的更完整示例,请参见此问题。这就是问题所在

printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal,
    *((int *)exit_status));
线程函数返回NULL,因此这是存储在exit_status中的值。所以现在在你的printf中你这样做

*((int *)exit_status
您正在将此空指针强制转换为int*,然后取消对它的引用。取消对空指针的引用不是一个好主意。有关如何使用退出状态的更完整示例,请参见此问题

如果线程函数返回NULL,那么它将尝试取消对它的引用。在执行此操作之前,您应该测试退出状态:

如果线程函数返回NULL,那么它将尝试取消对它的引用。在执行此操作之前,您应该测试退出状态:


啊。。。我应该测试一下谢谢你的提醒!啊。。。我应该测试一下谢谢你的提醒!