Pon*_*dle 9 c++ multithreading exception-handling exception c++11
根据这里和这里的文档,C++ 11线程的join方法将抛出一个std::system_errorif joinable() == false.因此,等待线程完成执行的自然方式是:
if (thread2.joinable()) thread2.join();
Run Code Online (Sandbox Code Playgroud)
但是,这有可能抛出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) {}
Run Code Online (Sandbox Code Playgroud)
但是当一个合法的std :: system_error被抛出时,可能表明线程无法加入,程序继续进行,就好像一切都很好而花花公子.除了使用像这样的try/catch块之外,还有一种正确的方法来加入一个线程吗?
Nic*_*las 10
joinable不会做你认为它做的事情.所有它的作用是返回是否线程对象不与线程关联.但是,thread::join如果线程对象也表示当前线程,则将失败.所以,thread::join由于缺乏而导致失败的唯一原因joinable是你是否试图加入自己.
一个完成的线程(这是不是你自己的)仍然是完全可连接的.
| 归档时间: |
|
| 查看次数: |
3604 次 |
| 最近记录: |