C++11动态线程池

C++11 Dynamic Threadpool

本文关键字:线程 动态 C++11      更新时间:2023-10-16

最近,我一直在努力寻找一个用于线程处理并发任务的库。理想情况下,是一个在线程上调用函数的简单接口。任何时候都有n个线程,有些线程完成得比其他线程快,到达的时间也不同。

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

C++11有很多关于线程和并发的东西,我发现了很多类似于线程池的例子。

https://github.com/bilash/threadpool

类似的项目将相同的lambda表达式与std::thread和std::mutex一起使用。

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

如何添加新线程?是否删除过期的线程?(.Join()??)

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

这里有没有来自有C++并发经验的人的提示或建议?

  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_roop_function

    这是一个等待任务队列的"while(true)"循环

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

一旦您集成了这些成分,您就拥有了自己的动态线程池。这些线程总是在运行,等待作业执行。

这应该很容易使用:https://pocoproject.org/docs/Poco.ThreadPool.html


线程池总是保持一定数量的线程运行,为接受工作。创建和启动线程可能会导致应用程序的运行时开销。线程池有助于改进通过减少线程数量来提高应用程序的性能必须创建(并再次销毁)。线程池中的线程是一旦它们再次可用,则重新使用。线程池始终保持运行的线程的最小数量。如果demans用于线程增加时,会创建额外的线程。一旦对线程的需求再次下沉,不再使用的线程将停止并从水塘

ThreadPool(
int minCapacity = 2,
int maxCapacity = 16,
int idleTime = 60,
int stackSize = 0
);

这是一个非常好的库,很容易使用,不像Boost:(

https://github.com/pocoproject/poco