调用pthread_join()后的分段错误

时间:2011-05-03 19:19:59

标签: c pthreads systems-programming

我使用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。

请妥善解释我。

4 个答案:

答案 0 :(得分:9)

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

pthread_join(pid1,end);

你应该做的是:

void *end;
pthread_join(pid1, &end);

即。将有意义的指针传递给您想要结果的变量,而不是未初始化的指针。

答案 1 :(得分:5)

我认为问题是传递给end的{​​{1}}指针实际上并没有指向任何地方。请尝试以下方法:

pthread_join()

答案 2 :(得分:1)

分段错误仅仅意味着您已尝试进行内存访问或跳转到内存中某些位置,操作系统不允许您执行代码或从中读取/写入。在这种情况下,您生成的子线程假设在pthread_join()调用之后返回到,因为操作系统已清理主父进程并回收了主父进程使用的所有内存(这包括执行代码)如堆栈空间,堆空间等)? ...用户陆地线程无法访问内存,因此操作系统会抛出分段错误。

答案 3 :(得分:-2)

你在主线程中调用pthread_exit(),然后它自己会立即退出main(),结束进程。第二个线程解锁并发现自己处于一个非常奇怪的位置!在这一点上,你深陷未定义的行为之地。你应该从主线程调用pthread_join。