我使用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); }
Main Thread ID: 0xb7880b30 New Thread ID: 0xb787eb70 I am going off Segmentation fault
在我研究的时候,调用pthread_join的线程(pid2)将阻塞,直到在参数(pid1)中传递的线程调用pthread_exit().并且pthread_exit()用于停止执行特定线程,让所有其他线程继续执行.
我想知道为什么我最后会遇到Segmentation Fault.
请妥善解释一下.
解决方法
您正在使用未初始化的变量void ** end;,这会导致未定义的行为:
pthread_join(pid1,end);
你应该做的是:
void *end; pthread_join(pid1,&end);
即将有意义的指针传递给您想要结果的变量,而不是未初始化的指针.