c++ 11不使用try / catch块安全地连接线程

C++11 safely join a thread without using a try / catch block

本文关键字:安全 连接 线程 连接线 catch try c++      更新时间:2023-10-16

根据这里和这里的文档,c++ 11线程的join方法如果抛出joinable() == false,将抛出std::system_error。因此,等待线程完成执行的自然方法是:

if (thread2.joinable()) thread2.join();

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

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

try {
    thread2.join();
catch (std::system_error &e) {}

但是当抛出一个合法的std::system_error(可能表示线程未能连接)时,程序继续运行,表现得好像一切正常。除了使用像这样的try/catch块之外,是否有一种合适的方法来加入线程?

joinable并不像你想象的那样。它所做的全部是返回线程对象是否与线程相关联。但是,如果线程对象也代表当前线程,thread::join将失败。因此,thread::join由于缺乏joinable而失败的唯一原因是如果您试图与自己联合。

一个完成的线程(不是你自己的)仍然是完全可接合的。