根据此处和此处的文档,C++11 线程的 join 方法将抛出std::system_error
if 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 块之外,还有没有合适的方法来加入线程?