我有一个启动pthread的程序,然后在它返回之前等待该线程的终止。代码类似于:
int main(int32_t argc, char* argv[]) {
pthread_t t;
/* initialization and other stuff
...
*/
printf("join result:%d\n", pthread_join(t, 0));
return 0;
}
程序打印,应该是:join result: 0
。所以加入工作, t 完成。然而,该计划并没有停止执行。如果我在exit(0)
行之前插入命令return 0
(或其他一些数字),我只能强制停止。
然而,如果我删除了pthread_join
调用的行,程序将完美无缺地退出。
这怎么可能?什么可以阻止程序在所有子线程加入后完成执行?
编辑:我刚刚发现gdb告诉我在执行}
的最后一行后出现了分段错误。不过我不知道幕后发生了什么:
Program received signal SIGSEGV, Segmentation fault.
0x000000060003aa10 in ?? ()
答案 0 :(得分:0)
我认为主线程中可能会出现堆栈损坏。从windows我知道在执行main之前,exit_process函数的地址被压入堆栈。然后返回0执行exit_process调用。如果在您的情况下堆栈已损坏,则可能会将指向exit_process的指针替换为无效指针。