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

能否在非父线程中调用std::thread::join()?附代码场景问询

关于std::thread::join()的两个问题解答

问题1:能否从非父线程调用std::thread::join()?

当然可以!C++标准对std::thread::join()的调用没有限制必须是创建该线程的父线程。只要目标std::thread对象处于可joinable状态(也就是还没有被调用过join()或detach(),并且关联的线程确实存在),任何有权访问这个线程对象的线程都可以调用它的join()方法。

调用join()的核心作用是阻塞当前线程,直到目标线程执行完毕,这个操作和调用线程是不是创建者完全无关。


问题2:在给定代码中,能否在goo线程中对A::thread执行join操作?

先看你的代码,这里有一个编译错误需要先解决:

因为struct A包含了std::thread成员,而std::thread是不可拷贝的(它的拷贝构造函数被显式删除了),所以A的默认拷贝构造函数也会被编译器自动删除。当你在main中创建other_thread时:

std::thread other_thread{goo, a};

这里尝试将a按值传递给goo,这会触发A的拷贝构造,而这是不允许的,代码会编译失败。

修正代码后是否合法?

如果我们修改代码,用std::ref传递a的引用:

std::thread other_thread{goo, std::ref(a)};

这时代码可以正常编译,并且在goo线程中调用a.thread.join()是完全合法且符合C++标准的。

原因和问题1的结论一致:只要a.thread处于可joinable状态(你的代码中a.foo()已经创建了线程,且没有提前join或detach),任何线程(这里的goo线程)都可以调用它的join()方法来等待该线程完成。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:38:56