为何仅调用一次pthread_create,线程却有时执行两次?
问题解析
核心原因:主线程提前退出引发未定义行为
注释掉pthread_join时,主线程创建子线程后,会直接执行打印操作、然后return 0退出进程。此时子线程的执行状态完全不确定:
- 可能还没开始执行,进程就终止了,看不到子线程的输出;
- 可能刚好执行完一次,正常输出;
- 也可能在进程终止的过程中,输出缓冲区的内容被重复刷新,或者子线程的执行流程被异常中断,造成"执行两次"的假象——本质是进程退出时的资源回收行为导致的未定义输出。
操作系统在进程退出时,会强制终止所有存活的线程并回收资源,这个过程没有严格的执行顺序保证,所以才会出现各种不确定的现象。
pthread_join的作用
调用pthread_join(ptid,NULL)后,主线程会阻塞等待,直到子线程完全执行完毕、返回结果后,才会继续执行后续代码并退出进程。这就确保了子线程的执行是完整且不受干扰的,因此每次运行都只会看到一次子线程的输出。
补充说明
初始代码中int func()的签名不符合pthread_create的要求(线程入口函数必须是void* (*)(void*)类型),这本身也会引发未定义行为;你修改后的void* func(void* arg)是正确的,但主线程提前退出的问题才是导致"有时执行两次"的关键。
内容的提问来源于stack exchange,提问作者yoyo_fun
相关产品推荐
相关产品推荐

