测试是否已调用join

时间:2017-02-16 12:52:51

标签: c++ c++11 stdthread

在线程的while循环中调用joinable()函数以测试线程上是否存在连接请求或者是否存在我目前不考虑的任何副作用是否合法?

1 个答案:

答案 0 :(得分:1)

  

在线程的while循环中调用joinable()函数以测试线程上是否存在连接请求或者是否存在我目前不考虑的任何副作用是否合法?< / p>

除非您使用某种手动同步,否则这可能会导致数据争用(因此未定义的行为)。

std::thread::join()是一个非const成员函数,因此对它的任何调用可能与对同一对象的成员函数的任何其他调用同时发生冲突,并导致数据竞赛。

因此,如果一个线程调用std::thread::join()而另一个线程同时调用同一对象上的std::thread::joinable(),则会出现数据争用和未定义的行为。

你可以通过使用互斥锁序列化调用来解决这个问题,这样任何时候只有一个对象可以访问该线程,但我会考虑你的设计是否有意义。提示:它没有。调用joinable()会告诉您线程是否已已加入,而不是调用join()已开始。线程在其仍在运行时无法加入(对join()的调用将阻止并等待它完成)。因此,正在运行的线程永远看不到管理它的joinable() == false对象的std::thread,因为如果它能够调用joinable(),那么它仍在运行,所以它可以加入!

所以:

  1. 除非您非常小心,否则尝试这样做可能会导致未定义的行为。

  2. 无论如何它都没有意义。

  3. 而是使用类似std::atomic<bool>(或boolstd::mutex)的内容来记录是否已请求线程停止运行,并从正在运行的线程中检查它。