C 11动态Threadpool
最近,我一直在努力寻找一个用于线程并发任务的库.理想情况下,一个简单的接口调用线程上的函数.任何时候都有n个线程,有些线程比其他线程更快,并且在不同时间到达.
首先我正在尝试Rx,这在c中很棒.我也研究过Blocks和TBB,但它们要么是平台依赖的.对于我的原型,我需要保持独立于平台,因为我们不知道它将在何处运行,并且在做出决策时可以改变. C 11有许多用于线程和并发的东西,我发现了一些类似于线程池的例子. https://github.com/bilash/threadpool 类似的项目使用与std :: thread和std :: mutex相同的lambda表达式. 这看起来非常适合我需要的东西.有一些问题.池以定义数量的线程启动,任务排队,直到线程空闲. 我该如何添加新线程? 显然,对于已知数量的线程来说这更容易,因为它们可以在ctor中初始化然后在dtor中加入(). 来自具有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_loop_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)); 一旦集成了这些成分,您就拥有了自己的动态线程池.这些线程总是运行,等待工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |