我想确保在对象被破坏之前完成一个线程。
这是我能想到的最基本的例子:
struct User {
std::thread worker_thread;
~User() {
if (worker_thread.joinable()) {
worker_thread.join();
}
}
};
这是解决问题的正确方法吗?
答案 0 :(得分:2)
这是不正确的,因为join()
可能会抛出异常,并且您不希望任何异常转义任何析构函数。来自Herb Sutters Exceptional C++的 Destructors Throw和为什么他们是邪恶的部分。:
遵守规范的异常安全规则:永远不要允许异常从析构函数或重载的运算符
delete()
或operator delete[]();
中转义每个析构函数和释放函数,就好像它有一个异常规范“throw()
。“
答案 1 :(得分:1)
我也认为评论中提到它很好,但你需要确保在需要时正确退出一个帖子。
例如,如果循环计数器缓慢倒计时,则需要在长等待队列之前正确关闭。当你有一个无休止的"布尔条件,例如必须切换,等等。