C++11 动态线程池

2024-05-14

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

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

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

https://github.com/bilash/threadpool https://github.com/bilash/threadpool

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

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

我如何添加新线程? 删除过期的线程? (。加入()??)

显然,这对于已知数量的线程来说要容易得多,因为它们可以在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. 无限循环函数

    这是一个等待任务队列的“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));
    

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 动态线程池 的相关文章

随机推荐

  • 如何在超时的情况下在单独的调度程序上运行 Akka Streams 图?

    这个问题是基于我做过的一个宠物项目 这个SO https stackoverflow com questions 34641861 akka http blocking in a future blocks the server 34645
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • 通过新数据更新绘图,而不是在 Jupyter 笔记本中制作新绘图

    我有一些问题 希望你能帮我解决 我需要使用下拉小部件创建交互式绘图 我可以在其中选择并绘制感兴趣的数据 我通过以下方式做到这一点 import plotly graph objects as go import ipywidgets as
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Cocoa 基于文档的应用程序中的 MVC

    我目前正在对我的应用程序进行重构和重组 我意识到模型和视图及其控制器之间的一些分离已经减少 我希望进行一些清理 我的应用程序中使用了几个关键类 NSPersistentDocument NSWindowController 和模型类 NSP
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 如何显示 GroupList 的 FormArray?

    我正在尝试制作一个交互式表单 在每一行上列出一个项目以及一个删除按钮 在我的示例中称为 verwijderen 这些项目是从数据库中检索的 并且每个项目都实例化为名为的自定义对象LaborPeriod 然后这些对象被转化为FormGroup
  • 延迟图像下载完成后更新 UITableViewCell

    异步下载单元格图像后 我在更新 UITableViewCells 时遇到一些问题 我正在使用自定义 UITableViewCells 如下所示 UITableViewCell tableView UITableView tableView
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • 无法在 GCP Cloud Scheduler 上创建作业

    当我尝试在 GCP Cloud Scheduler 中创建作业时 出现以下错误 error code 7 message 主体 用户或服务帐户 缺少资源 我的服务帐户 的 IAM 权限 iam serviceAccounts actAs 或
  • CSS 动画自定义属性/变量

    一段时间以来我一直在努力让它发挥作用 关键是内部 div 将具有某种形状 并且可能会不止一个 这就是为什么我使用nth child选择器 这个内部 div 应该显示然后再次隐藏一段时间 问题是 我想在一个动画中为所有 后来的 多个内部 di
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 是否有关于 EML 文件格式的 RFC?

    基本上 我正在尝试使用 EML 文件 我想知道这些文件在不同的电子邮件服务器上是否相当标准 基本上 EML 文件上是否有一个 RFC 就像电子邮件地址和其他主题的 RFC 一样 我想我可以更具体一点 以便更好地了解我需要什么 我正在扫描 E
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 在 Clojure 和其他 Lisp 方言中,在函数名称末尾使用星号的约定是什么?

    请注意 我不是在谈论符号名称中的耳罩 这个问题在Clojure 常量的约定 样式和用法 https stackoverflow com questions 3579063 conventions style and usage for cl
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • Shiny可以识别用鼠标选择的文本(突出显示的文本)吗?

    我需要用户将文本片段分配给 Shiny 中的类别或 代码 基本上 我希望用户突出显示输出中的文本 在下面的示例中 来自table or text输出 然后按一个按钮 code 并将选定的文本分配给应用程序内的对象 在下面的应用程序中 所选文
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和