2.1.4 在后台运行线程
分离线程
我们已经知道了,可以通过调用join()来等待线程完成;如果无需等待线程完成,可以通过分离(detaching)线程来实现,在std::thread对象上调用detach()函数,会把线程丢在后台运行,没有直接的办法与之通信。
struct func; // 前面定义很多遍了 void opps() { int some_local_state = 0; func my_func(some_local_state); std::thread my_thread(my_func); // 二者必选一 // my_thread.join(); // 等待线程,确保线程结束后,才退出 my_thread.detach(); // 不等待线程,退出函数后,线程可能还在运行 }
分离线程的使用
被分离的线程无需任何显示的用户界面,而运行在后台。这样的线程通常是长时间运行的,可能存在与应用程序的整个生命周期中,执行后台任务,例如监控文件系统、清除对象缓存或是优化数据结构。
其它
需要说明的是,一旦开始了一个std::thread线程,你需要显示地决定是要等待它完成(结合),还是让他自行运行(分离)。如果你在std::thread对象被销毁前,还没有做决定,那么程序会异常退出。
具体原因是:std::thread对象在创建后默认是可连接的(joinable() == true)的, 当其调用join()或者detach()后,线程变成不可连接(joinable() == false)状态,如果没有两个中任意一个,析构函数将调用std::terminate()函数终止进程,异常退出。
总结一句话,你必须在std::thread对象的作用域内,选择调用join()或者detach()二者之一,两者必须选一个,也只能选一个。
~thread() // thread的析构函数 { if(joinable()) std::terminate(); // 终止进程,异常退出 }