判断哪些线程已终止的有效方法

Effective Way to Tell Which Threads Have Terminated

本文关键字:有效 方法 终止 线程 判断      更新时间:2023-10-16

我正在用C++编写一个服务器,它由一个接受传入请求的主线程组成,然后生成一个新的std::thread对象来处理响应它的任务。

这个 std::thread 对象进入线程列表,我想像这样定期清理这个列表:

For each thread in the list:
  If the thread has finished executing:
    Call join on the thread
    Remove the thread object from the list

现在的挑战是如何确定这个线程(正在执行 void 函数)是否已经到达终点。joinable() 函数不起作用,因为它在执行过程中和之后都返回 true,并且我只希望我的主线程在完成后调用 join(),否则它将挂起并等待该子线程串行而不是并行执行。

好吧,您的架构选择是"每个请求的线程",那么您应该尊重有关副作用的一些核心事实。

    线程
  1. 执行很便宜,线程创建不便宜
  2. 同时存在的线程过多会白白浪费您的 RAM

鉴于此,您不应该为"线程是否还活着"而烦恼。更好的是,您应该使用"线程池"习惯用语来缓解上述两种风险:

  1. 中的所有线程都是预先创建的,然后它们与池一样长,只是等待下一部分代码执行。
  2. 与电影院一样,线程池的空位数量有限,因此您始终可以预测线程需要多少资源。

因此,您想要的流程应该是:

For each thread in the list:
    Wait for a new request to process
    Get next request from the incoming queue
    Process it