C++ 11安全地加入一个线程而不使用try/catch块

Pon*_*dle 9 c++ multithreading exception-handling exception c++11

根据这里这里的文档,C++ 11线程的join方法将抛出一个std::system_errorif joinable() == false.因此,等待线程完成执行的自然方式是:

if (thread2.joinable()) thread2.join();
Run Code Online (Sandbox Code Playgroud)

但是,这有可能抛出std :: system_error.考虑线程1调用thread2.joinable(),返回true,表明thread2仍在运行.然后调度程序暂停thread1并将上下文切换到线程2.线程2完成,然后线程1重新开始.线程1调用thread2.join(),但是thread2已经完成,结果抛出了std :: system_error.

一个可能的解决方案是将整个事物包装在try块中:

try {
    thread2.join();
catch (std::system_error &e) {}
Run Code Online (Sandbox Code Playgroud)

但是当一个合法的std :: system_error被抛出时,可能表明线程无法加入,程序继续进行,就好像一切都很好而花花公子.除了使用像这样的try/catch块之外,还有一种正确的方法来加入一个线程吗?

Nic*_*las 10

joinable不会做你认为它做的事情.所有它的作用是返回是否线程对象不与线程关联.但是,thread::join如果线程对象也表示当前线程,则将失败.所以,thread::join由于缺乏而导致失败的唯一原因joinable是你是否试图加入自己.

一个完成的线程(这是不是你自己的)仍然是完全可连接的.

  • 如果线程被分离,`joinable`也将返回`false`. (4认同)