【问题标题】:Effective Way to Tell Which Threads Have Terminated [duplicate]判断哪些线程已终止的有效方法[重复]
【发布时间】:2019-01-31 11:17:02
【问题描述】:

我正在用 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(),否则它将挂起并等待该子线程串行而不是并行执行。

【问题讨论】:

  • 标准 C++ 中没有办法;解决方案是特定于平台的。在 Windows 中使用 if (WaitForSingleObject(thread.native_handle(), 0) == WAIT_OBJECT_0)

标签: c++ multithreading


【解决方案1】:

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

  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多