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();    // 终止进程,异常退出
}

   

posted on 2021-05-18 10:47  天官赐福  阅读(119)  评论(0)    收藏  举报