在析构函数中将 joinable()
的线程 join()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class thread_guard { std::thread& t; public: explicit thread_guard(std::thread& t_) : t(t_) {} ~thread_guard() { if (t.joinable()) t.join(); } thread_guard(thread_guard const&) = delete; thread_guard& operator=(thread_guard const&) = delete; };
struct func { int& i; func(int& i_) : i(i_) {} void operator()() { for (unsigned j = 0; j < 10000000; ++j) { do_something(i); } } };
void f() { int some_local_state = 0; func my_func(some_local_state); std::thread t(my_func); thread_guard g(t); do_something_in_current_thread(); }
|
要点:
- 局部变量会按照构造函数的逆序被销毁
- 析构函数在调用
join()
前要首先测试是不是 joinable()
的,因为 join()
只能调用一次。
- 拷贝构造函数和拷贝赋值运算符被标记
=delete
,以确保他们不会由编译器自动提供,任何复制 thread_guard
对象的企图都将产生编译错误。
如果无需等待线程完成,可以通过 detach()
把线程丢在后台运行(被分离的线程通常被称为守护线程)。