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

pthread多线程问题:clone创建嵌套子进程时线程提前执行

问题根因分析

你观察到的「线程函数提前执行」是假象,本质是代码存在逻辑错误,误将线程入口函数当成普通函数主动调用了:

  • 你的print是专门给pthread线程用的入口函数,内部本身就会打印4. In thread、5. Message from parent这两行内容
  • 你在child函数第一处执行逻辑就直接调用了print("\n2. In child 1"),这就是输出开头多出来的那段线程打印的唯一来源,和第二个子进程里创建的线程没有任何关系

你可以对应输出验证:你传给print的参数就是"\n2. In child 1",所以输出里才会出现5. Message from parent: 之后直接换行打印2. In child 1的现象,完全和你传入的参数内容匹配。

修复建议

把child函数里的print("\n2. In child 1");替换成普通的printf调用即可:

// 替换前
print("\n2. In child 1");
// 替换后
printf("\n2. In child 1\n");

修复后程序就会按照你预期的1→2→3→4→5→6→7→8→9的顺序执行,不会再出现提前打印线程内容的问题。

额外注意事项
  • 使用clone系统调用手动分配栈时,注意栈增长方向的兼容性,你当前用的stack_ptr+STACK_Size在x86等栈向下增长的架构上是正确的,迁移到其他架构要做适配
  • 如果你开启了CLONE_VM参数,要注意子进程和父进程共享地址空间时的变量并发访问问题,你当前示例里的msg是栈变量,默认不开启CLONE_VM时子进程会拷贝地址空间,不存在野指针问题,开启后要注意父进程栈变量回收的风险

内容的提问来源于stack exchange,提问作者Mukela Katungu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:57:06