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

时间:2013-04-14 01:06:41

标签: c++ multithreading exception c++11 exception-handling

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

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

但是,这有可能抛出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) {}

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

1 个答案:

答案 0 :(得分:10)

joinable没有按照您的想法行事。 所有它返回的是线程对象是否与线程无关。但是,如果线程对象也表示当前线程,则thread::join将失败。因此thread::join由于缺少joinable而失败的唯一原因是,如果您尝试加入自己。

已完成的主题(不是您自己的)仍可完美连接。