【发布时间】:2014-06-20 13:29:01
【问题描述】:
我有一个程序启动一个 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 完成。尽管如此,程序并没有停止执行。如果我在return 0 行之前插入命令exit(0)(或其他数字),我只能强制它停止。
但是,如果我删除带有pthread_join 调用的行,程序将完美退出。
这怎么可能?在所有子线程加入后,什么可以阻止程序完成执行?
编辑:我刚刚发现 gdb 告诉我在使用 } 执行最后一行后出现分段错误。不过我不知道幕后发生了什么:
Program received signal SIGSEGV, Segmentation fault.
0x000000060003aa10 in ?? ()
【问题讨论】:
-
我在查看手册页时遇到了这个问题:如果多个线程同时尝试加入同一个线程,则结果未定义。如果调用 pthread_join() 的线程被取消,那么目标线程将保持可连接状态(即它不会被分离)。你有没有机会做这样的事情?
-
@RobertEkendahl 但是这不会反映在
printf的消息中吗?无论哪种方式,我只有一个主线程来创建和连接其他线程。 -
我看不出有什么明显的原因可以解释为什么会出现段错误。你能再贴一些代码吗?
-
@RobertEkendahl 我会尽量减少代码以将代码减少到最低限度,并会尽快发布。
-
我认为主线程中可能发生堆栈损坏。从windows我知道在执行main之前,exit_process函数的地址被压入堆栈。然后 return 0 执行一个 exit_process 调用。如果在您的情况下堆栈已损坏,则指向 exit_process 的指针可能被替换为无效指针。
标签: c pthreads pthread-join