6

我使用 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() 用于停止特定线程的执行,让所有其他线程继续执行。

我想知道为什么我最后得到了分段错误。

请正确解释我。

4

3 回答 3

9

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

pthread_join(pid1,end);

你应该做的是:

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

即传递一个有意义的指针到一个你想要结果的变量,而不是一个未初始化的指针。

于 2011-05-03T20:04:30.483 回答
5

我认为问题在于您end传递给的指针pthread_join()实际上并未指向任何地方。尝试以下操作:

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);
}
于 2011-05-03T20:04:51.017 回答
1

分段错误仅意味着您试图进行内存访问或跳转到操作系统不允许您执行代码或读取/写入的内存中的某个位置。pthread_join()在这种情况下,由于操作系统已经清理了主父进程并回收了主父进程使用的所有内存(这包括执行代码和堆栈空间,所以您生成的子线程应该在调用后返回到哪里,堆空间等)?...绝对不是用户级线程可以访问的内存,因此操作系统会引发分段错误。

于 2011-05-03T19:54:45.380 回答