如何在c++中实现线程池?

How should I implement a thread pool in C++?

本文关键字:线程 实现 c++      更新时间:2023-10-16

我正在尝试将c#线程池移植到c++中,但遇到了一些严重的问题。c#线程池的一些特性如下:

  1. 明确定义并发线程的最大数量
  2. 每个线程使用AutoResetEvent定义
  3. 线程中的每个工作项都被重载,因此它可以将委托函数作为其私有成员。
例如,

private static void RunOrBlock(WorkItem workitem) {
  workItem.ThreadIndex = WaitHandle.WaitAny(threadUnoccupied);
  ThreadPool.QueueUserWorkItem(threadWorker, workItem);
}
private static void threadWorker(object o) {
  WorkItem workItem = (workItem) o;
  workItem.Run();
  threadUnoccupied[workItem.ThreadIndex].Set();
}

工作项定义为:

public abstract class WorkItem {
  protected int threadIndex;
  public abstract void Run();
  public int ThreadIndex {
    get { return threadIndex; }
    set { threadIndex = value; } 
  }

有人知道是否存在一个具有类似功能的开源线程池吗?如果不是,实现这样一个线程池的正确方法是什么?谢谢!

我不确定它们的具体功能,但是对于c++中的开源线程池,请查看boost threadpool或zthreads。

如果你只是需要一个线程池的功能,并且有一个编译器支持它,你也可以只使用openmp 3.0 tasks。如果可能的话,这是我会选择的,因为"boost" threadpool乍一看并不很有说服力(所以可能有相当多的开销),而且zthreads似乎不再积极发展(至少乍一看,我不是100%肯定)。

不完全是自由/开源软件,但如果你能接受许可(或者准备投入相当多的钱…)Intel Threading Building Blocks基本上是基于跑步池的