10

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

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

但是,这有可能引发 std::system_error。考虑线程1调用thread2.joinable(),返回true,说明thread2还在运行。然后调度程序暂停线程 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 块之外,还有没有合适的方法来加入线程?

4

1 回答 1

10

joinable不做你认为它做的事。它所做的只是返回线程对象是否与线程相关联但是,thread::join如果线程对象也代表当前线程,则会失败。thread::join因此,由于缺乏而失败的唯一原因joinable是如果您尝试加入自己。

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

于 2013-04-14T01:27:39.460 回答