我应该如何在C ++中实现线程池?

时间:2011-11-29 00:11:48

标签: c++ multithreading

我正在尝试将C#线程池移植到C ++中,但遇到了一些严重的问题。 C#线程池的一些功能是:

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

    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();
    }
    

    WorkItem定义为:

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

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

1 个答案:

答案 0 :(得分:2)

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

如果您只需要类似线程池的功能并且有一个支持它的编译器,您也可以使用openmp 3.0 tasks。如果可能的话,我会选择这个,因为"boost" threadpool一眼就看起来不那么令人信服(因此可能有相当多的开销)并且似乎zthreads不再被积极开发(至少乍一看,我不是百分百肯定的。

在不完全是化石的情况下,但如果您可以使用许可证(或准备投入相当多的钱......)可能是可用的。Intel Threading Building Blocks几乎是基于踏板的