c++ 11不使用try / catch块安全地连接线程
C++11 safely join a thread without using a try / catch block
根据这里和这里的文档,c++ 11线程的join方法如果抛出joinable() == false
,将抛出std::system_error
。因此,等待线程完成执行的自然方法是:
if (thread2.joinable()) thread2.join();
但是,这有可能抛出std::system_error。考虑线程1调用thread2.joinable(),返回true,表示线程2仍在运行。然后调度器暂停线程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块之外,是否有一种合适的方法来加入线程?
joinable
并不像你想象的那样。它所做的全部是返回线程对象是否与线程相关联。但是,如果线程对象也代表当前线程,thread::join
将失败。因此,thread::join
由于缺乏joinable
而失败的唯一原因是如果您试图与自己联合。
一个完成的线程(不是你自己的)仍然是完全可接合的。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 当套接字连接断开时检测C/C++Unix
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 将 QObject 用作类成员并将该成员用作连接的上下文是否安全?
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 使用C 安全套接字连接
- Qt的连接调用本身线程安全吗?
- 如何改善套接字上的安全连接
- 如何使用 Windows 本机 Wifi 功能连接到请求网络安全密钥的 Wifi
- 在C++中使用SSPI实现安全连接-澄清一些术语
- 桌面应用程序环回连接-可靠且安全
- 如何在C++中使用Poco连接安全的websocket
- 远程连接MySQL是安全的吗?
- c++安全SQL连接
- C++与数据库的安全连接