std::C++11中的线程,如何确保线程在析构函数中完成
std::thread in C++11, how to ensure a thread is finished inside a destructor
我想确保在对象被破坏之前线程已经完成。
下面是我能想到的最基本的例子:
struct User {
std::thread worker_thread;
~User() {
if (worker_thread.joinable()) {
worker_thread.join();
}
}
};
这是解决问题的正确方法吗?
这是不正确的,因为join()
可能会抛出异常,并且您不想让任何异常逃离任何析构函数。Herb Sutters在Destructors That Throw and Why They are Evil一节中介绍了出色的C++:
遵守规范的异常安全规则:永远不要允许异常从析构函数或重载运算符
delete()
或operator delete[]();
中转义。将每个析构函数和释放函数都写为"throw()
"."
我也认为这很好,正如评论中提到的,但如果需要,您需要确保正确退出线程。
例如,如果您有一个循环计数器在缓慢倒计时,那么您需要在漫长的等待队列之前正确关闭。更重要的是,当你有一个"无尽"的布尔条件,例如,必须切换,等等。
相关文章:
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 确保静态布尔检查的线程安全
- 如何确保槽在特定线程的上下文中执行?
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 为什么即使在使用 Qt::D irectConnection 之后,接收器的线程中仍会调用插槽?如何确保在另一个线程中调用它?
- 为什么我需要在多线程程序中使用pthread_sigmask来确保设置处理程序正在处理信号
- C 共享_ptr如何确保线程安全性
- 生产者/使用者,如何确保在关闭所有使用者之前耗尽线程安全队列
- 内存屏障:如何确保工作线程可以看到初始化写入?
- 如何确保这部分代码仅由一个线程运行(在 openmp 中)
- 如何确保变量在不同的线程读取它们之前存储到内存中
- 如何确保始终存在给定数量的线程?(另外,这是线程的良好用法吗?
- 在后台线程上创建的调度程序未关闭时会发生什么情况?如何确保调度程序已正确关闭
- std::C++11中的线程,如何确保线程在析构函数中完成
- 如何确保对象只有一个线程
- 矢量复制和多线程 :即使偶尔发生写入,如何确保多读
- 确保创建线程并在广播前等待
- 确保线程已启动winapi c++
- 运行时检查失败#0 - ESP值没有正确保存在…检查简单工作线程的点
- 线程同步以确保线程不会重叠