加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C 11动态Threadpool

发布时间:2020-12-16 07:07:58 所属栏目:百科 来源:网络整理
导读:最近,我一直在努力寻找一个用于线程并发任务的库.理想情况下,一个简单的接口调用线程上的函数.任何时候都有n个线程,有些线程比其他线程更快,并且在不同时间到达. 首先我正在尝试Rx,这在c中很棒.我也研究过Blocks和TBB,但它们要么是平台依赖的.对于我的原型,
最近,我一直在努力寻找一个用于线程并发任务的库.理想情况下,一个简单的接口调用线程上的函数.任何时候都有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));

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读