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
相关产品推荐
相关产品推荐

