根据文档here和here,如果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块之外,还有一种正确的方法来加入一个线程吗?
答案 0 :(得分:10)
joinable
没有按照您的想法行事。 所有它返回的是线程对象是否与线程无关。但是,如果线程对象也表示当前线程,则thread::join
将失败。因此thread::join
由于缺少joinable
而失败的唯一原因是,如果您尝试加入自己。
已完成的主题(不是您自己的)仍可完美连接。