2014-02-26 99 views
4

最近,我一直在寻找线程并发任务库。理想情况下,一个简单的接口调用线程上的函数。任何时候都有n个线程,有些完成的速度比别人快,并且在不同的时间到达。C++ 11动态线程池

首先我尝试了Rx,这在C++中很棒。我也研究过Blocks和TBB,但它们要么依赖于平台。对于我的原型,我需要保持平台的独立性,因为我们不知道它会在什么时候运行,并且可能会在做出决策时发生变化。

C++ 11有很多线程和并发的东西,我发现了很多像线程池这样的例子。

https://github.com/bilash/threadpool

类似的项目使用带的std ::螺纹和std ::互斥相同lambda表达式。

这看起来非常适合我需要的东西。有一些问题。这些池以定义数量的线程启动,任务排队直到线程空闲。

我如何添加新的线程? 删除过期的主题? (.Join()??)

显然,这对于已知数量的线程来说要容易得多,因为它们可以在ctor中初始化,然后在dtor中加入()。

这里的任何提示或指针来自具有C++并发经验的人吗?

+0

GCD或libdispatch http://en.wikipedia.org/wiki/Grand_Central_Dispatch –

+1

我使用Boost :: Asio来创建一个简单的线程池。也许你想看看这个示例http://stackoverflow.com/q/14265676/991425 – Haatschii

+0

是的。我读过GCD。 C++中的任何示例或教程源代码?跨平台支持IS boost吗? – WebSight

回答

1
  1. 开始的最大线程数的系统可以支持:

    int Num_Threads = thread::hardware_concurrency(); 
    
  2. 为了有效的线程池的实现,一旦线程根据NUM_THREADS创建,最好不要制造新的,或销毁旧的(通过加入)。性能会受到影响,甚至会使您的应用程序比串行版本变慢。

    每个C++ 11线程应该在它们与一个无限循环功能运行,不断地等待新的任务,抓住和运行。

    下面是如何这样的功能附加到线程池:

    int Num_Threads = thread::hardware_concurrency(); 
    vector<thread> Pool; 
    for(int ii = 0; ii < Num_Threads; ii++) 
    { Pool.push_back(thread(Infinite_loop_function));} 
    
  3. 的Infinite_loop_function

    这是一个 “而(真)” 循环中,等待任务队列

    void The_Pool:: Infinite_loop_function() 
    { 
        while(true) 
        { 
         { 
          unique_lock<mutex> lock(Queue_Mutex); 
    
          condition.wait(lock, []{return !Queue.empty()}); 
          Job = Queue.front(); 
          Queue.pop(); 
         } 
         Job(); // function<void()> type 
        } 
    }; 
    
  4. 将功能添加到您的队列中

    void The_Pool:: Add_Job(function<void()> New_Job) 
    { 
        { 
         unique_lock<mutex> lock(Queue_Mutex); 
         Queue.push(New_Job); 
        } 
        condition.notify_one(); 
    } 
    
  5. 绑定任意函数到队列

    Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object)); 
    

一旦整合这些成分,你有你自己的动态线程池。这些线程总是运行,等待工作要做。