【发布时间】:2021-02-21 01:07:15
【问题描述】:
参考:
检查 std::thread 对象是否标识了一个活动线程 执行。
具体来说,如果 get_id() != std::thread::id() 则返回 true
最后,函数所做的只是将线程的标识符与 0 进行比较。
https://en.cppreference.com/w/cpp/thread/thread/joinable
实际代码(线程):
_NODISCARD bool joinable() const noexcept {
return _Thr._Id != 0;
}
【问题讨论】:
-
你有没有偷看
std::thread::id是什么? -
我还没有,无论如何。文档指出,如果由执行的活动线程调用,该函数应该返回 false,而我开始潜伏于此的原因并非如此。该函数与 0 进行比较。
-
如果它的行为方式相同,则实现无关紧要。如果您在使用
std::thread时遇到问题,请使用minimal reproducible example 发布新问题。 Visual Studio 实现正确且有效,问题很可能出在您的代码中 -
不调用 by,调用 on 与活动线程关联的
std::thread。要么您误解了规范,要么误解了 Microsoft 的实施。甚至可能两者兼而有之。无论哪种方式,它的行为都符合规定。 -
@Vega4 "线程是否由当前活动线程执行" 这不是
joinable所做的。从您链接的页面:“检查是否 std::thread 对象 标识一个活动的执行线程” .您调用joinable来自的线程无关紧要。
标签: c++ multithreading visual-studio