测试是否已调用 join
Test if join has been called
在线程的 while 循环中调用 joinable() 函数来测试线程上是否有加入请求是否合法,或者是否有任何我目前没有考虑的副作用?
Is it legal to call the joinable()
function inside a thread's while loop to test if there was a join request on the thread or are there any side effects I do not consider at the moment?
除非您使用某种手动同步,否则这可能会导致数据竞争(因此出现未定义的行为)。
std::thread::join()
是非常量成员函数,因此对它的任何调用可能与对同一对象的成员函数的任何其他调用并发,将 冲突 ,并导致数据竞争。
因此,如果一个线程调用 std::thread::join()
而另一个线程同时调用同一对象上的 std::thread::joinable()
,则您会发生数据竞争和未定义的行为。
您可以通过使用互斥体来序列化调用来解决此问题,以便在任何时候只有一个对象访问线程,但我会考虑您的设计是否有意义。提示:事实并非如此。调用 joinable()
将告诉您线程是否已 加入 ,而不是是否已开始调用 join()
。当线程仍为 运行 时无法加入线程(对 join()
的调用将阻塞并等待它完成)。所以 运行 线程永远不会看到管理它的 std::thread
对象的 joinable() == false
,因为如果它能够调用 joinable()
那么它仍然是 运行,所以可以加入!
所以:
除非您非常小心,否则尝试这样做会冒未定义行为的风险。
反正没有意义
而是使用类似 std::atomic<bool>
(或 bool
和 std::mutex
)的东西来记录线程是否已被请求停止 运行,并检查它来自 运行 线程。
在线程的 while 循环中调用 joinable() 函数来测试线程上是否有加入请求是否合法,或者是否有任何我目前没有考虑的副作用?
Is it legal to call the
joinable()
function inside a thread's while loop to test if there was a join request on the thread or are there any side effects I do not consider at the moment?
除非您使用某种手动同步,否则这可能会导致数据竞争(因此出现未定义的行为)。
std::thread::join()
是非常量成员函数,因此对它的任何调用可能与对同一对象的成员函数的任何其他调用并发,将 冲突 ,并导致数据竞争。
因此,如果一个线程调用 std::thread::join()
而另一个线程同时调用同一对象上的 std::thread::joinable()
,则您会发生数据竞争和未定义的行为。
您可以通过使用互斥体来序列化调用来解决此问题,以便在任何时候只有一个对象访问线程,但我会考虑您的设计是否有意义。提示:事实并非如此。调用 joinable()
将告诉您线程是否已 加入 ,而不是是否已开始调用 join()
。当线程仍为 运行 时无法加入线程(对 join()
的调用将阻塞并等待它完成)。所以 运行 线程永远不会看到管理它的 std::thread
对象的 joinable() == false
,因为如果它能够调用 joinable()
那么它仍然是 运行,所以可以加入!
所以:
除非您非常小心,否则尝试这样做会冒未定义行为的风险。
反正没有意义
而是使用类似 std::atomic<bool>
(或 bool
和 std::mutex
)的东西来记录线程是否已被请求停止 运行,并检查它来自 运行 线程。