class ThreadGuard {
public:
ThreadGuard(std::thread &t_): t(t_) {}
~ThreadGuard()
{
if(t.joinable())
t.join();
}
private:
std::thread &t;
};
void func()
{
std::thread my_thread(f);
ThreadGuard thread_guard(my_thread);
}
我尝试使用ThreadGuard对象来保证在线程正常终止之前func不会退出。但是如果在创建thread_guard对象之前发生异常会怎样。
答案 0 :(得分:0)
RAII的要点是资源获取对象实际拥有资源。您的null
仍然不能保证线程实际上是被保护的。你会想要更像的东西:
ThreadGuard
这样,你可以写:
class ThreadGuard {
std::thread t;
public:
~ThreadGuard() {
if (t.joinable()) t.join();
}
// constructors and assignment as appropriate to actually
// initialize the thread object
};
而不用担心。