在线程的 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()
的调用将阻塞并等待它完成)。所以正在运行的线程永远看不到joinable() == false
对于 std::thread
管理它的对象,因为如果它能够调用 joinable()
然后它仍在运行,因此可以加入!
所以:
除非您非常小心,否则尝试这样做会冒未定义行为的风险。
反正也没有意义。
而是使用类似 std::atomic<bool>
的东西(或一个 bool
和一个 std::mutex
)记录线程是否已被请求停止运行,并从正在运行的线程中检查它。
关于c++ - 测试是否已调用 join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42274539/