我已经使用POSIX pthread库编写了以下代码:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

pthread_t pid1,pid2;

void *test(void *arg)
{
void **end;
printf("\nNew Thread ID: 0x%x\n",(unsigned int)pid2);
pthread_join(pid1,end);
printf("\nNew Thread going to go off\n");
printf("\nNew Thread ID: 0x%x\n",(unsigned int)pid2);
return ((void *)NULL);
}

int main()
{
pid1 = pthread_self();
pthread_create(&pid2,NULL,test,NULL);
printf("\nMain Thread ID: 0x%x\n",(unsigned int)pid1);
sleep(2);
printf("\nI am going off\n");
pthread_exit(0);
}

在执行代码时,我得到以下输出:

主线程ID:0xb7880b30
新线程ID:0xb787eb70
我要走了
分段故障

正如我研究的那样,调用pthread_join的线程(pid2)将阻塞,直到传入参数(pid1)的线程调用pthread_exit()为止。 pthread_exit()用于停止特定线程的执行,让所有其他线程继续执行。

我想知道为什么最后会出现段错误。

请正确解释我。

最佳答案

您正在使用未初始化的变量void **end;,这会导致未定义的行为:

pthread_join(pid1,end);

相反,您应该做的是:
void *end;
pthread_join(pid1, &end);

也就是说,将有意义的指针传递给您要在其中获得结果的变量,而不是未初始化的指针。

关于c - 调用pthread_join()后出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5874518/

10-12 22:20