当倾向于在无异常的情况下使用join()
时, 需要在异常处理过程中调用join()
, 从而避免生命周期的问题。
struct func; // 定义在清单2.1中
void f()
{
int some_local_state=0;
func my_func(some_local_state);
std::thread t(my_func);
try
{
do_something_in_current_thread();
}
catch(...)
{
t.join(); // 1
throw;
}
t.join(); // 2
}
如果不想等待线程结束, 可以分离(detaching)线程, 从而避免异常安全(exception-safety)问题。 不过, 这就打破了线程与 std::thread 对象的联系, 即使线程仍然在后台运行着, 分离操作也能确保 std::terminate()
在std::thread 对象销毁才被调用。