【发布时间】:2013-04-06 08:32:03
【问题描述】:
根据文档here 和here,如果joinable() == false,C++11 线程的join 方法将抛出std::system_error。因此,等待线程完成执行的自然方式是:
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 块之外,还有其他合适的方法来加入线程吗?
【问题讨论】:
标签: c++ multithreading exception c++11 exception-handling