调用pthread_join()之后出现分段错误

| 我已经使用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);
也就是说,将有意义的指针传递给您想要结果的变量,而不是未初始化的指针。     
我认为问题在于传递给ѭ5的
end
指针实际上并没有指向任何地方。请尝试以下操作:
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);
}
    
分段错误仅表示您试图进行内存访问或跳转到操作系统不允许您从中执行代码或从中读取/写入的内存中的某个位置。在这种情况下,由于操作系统已经清理了主父进程并回收了主父进程使用的所有内存(因此包含您的执行代码以及堆栈空间),因此您生成的子线程应该在“ 5”调用之后返回? ,堆空间等)? ...绝对不是用户级线程可以访问的内存,因此OS会引发分段错误。     

要回复问题请先登录注册