C++11动态线程池
C++11 Dynamic Threadpool
最近,我一直在努力寻找一个用于线程处理并发任务的库。理想情况下,是一个在线程上调用函数的简单接口。任何时候都有n个线程,有些线程完成得比其他线程快,到达的时间也不同。
首先我尝试了Rx,它在c++中非常棒。我也研究过Blocks和TBB,但它们都依赖于平台。对于我的原型,我需要保持平台独立性,因为我们还不知道它将在什么平台上运行,并且在做出决定时可能会发生变化。
C++11有很多关于线程和并发的东西,我发现了很多类似于线程池的例子。
https://github.com/bilash/threadpool
类似的项目将相同的lambda表达式与std::thread和std::mutex一起使用。
这看起来非常适合我的需要。有一些问题。池以定义数量的线程启动,任务排队,直到线程空闲。
如何添加新线程?是否删除过期的线程?(.Join()??)
显然,对于已知数量的线程来说,这要容易得多,因为它们可以在ctor中初始化,然后在dtor中join()。
这里有没有来自有C++并发经验的人的提示或建议?
-
从系统可以支持的最大线程数开始:
int Num_Threads = thread::hardware_concurrency();
-
对于高效的线程池实现,一旦根据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));}
-
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 } };
-
制作一个函数,将作业添加到队列
void The_Pool:: Add_Job(function<void()> New_Job) { { unique_lock<mutex> lock(Queue_Mutex); Queue.push(New_Job); } condition.notify_one(); }
-
将任意函数绑定到队列
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
- C++为线程工作动态地分割例程
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 在多线程程序中使用动态数组的头段安全吗
- 线程的静态与动态内存分配
- 如何在Windows NT中获取线程的动态优先级
- C++11动态线程池
- 多个动态链接库(DLL)是否可以从静态库(LIB)共享线程本地存储
- 动态分配的工作线程在几分钟后泄漏,尽管它不应该
- 如何放置线程数组的动态大小
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- 如何实现动态线程 Boost::Barrier
- Boost::线程:从动态组中删除线程
- 使用动态参数创建线程
- 使用SetThreadAffinityMask()动态选择要在哪些线程上运行
- 如何连接在c/c++中动态创建的线程
- 在具有动态大小内存池的多线程C/C++中实现内存管理器
- 线程和动态内存
- c++中使用std::thread创建动态线程
- 多线程和动态数组/矩阵操作
- 从线程动态加载的dll调用类的成员函数