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

时间:2019-01-31 11:17:02

标签: c++ multithreading

我正在用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()函数不起作用,因为它在执行中及执行后都会返回真实的值,并且我只希望主线程在完成后调用join(),否则它将挂起并等待串行的该子线程而不是并行执行。

1 个答案:

答案 0 :(得分:0)

那么,您的体系结构选择是“每个请求的线程数”,那么您应该尊重一些有关副作用的核心事实。

  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