gpt4 book ai didi

C++11 动态线程池

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:44 25 4
gpt4 key购买 nike

最近,我一直在尝试寻找一个线程化并发任务的库。理想情况下,一个在线程上调用函数的简单接口(interface)。任何时候都有 n 个线程,一些线程比其他线程完成得更快,并且到达时间不同。

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

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

https://github.com/bilash/threadpool

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

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

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

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

这里有任何具有 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. 无限循环函数

    这是一个等待任务队列的“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. 将任意函数绑定(bind)到您的队列

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

一旦您整合了这些成分,您就拥有了自己的动态线程池。这些线程始终运行,等待作业完成。

关于C++11 动态线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22030027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com