You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何仅调用一次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:53:27