boost::thread 并创建它们的池!

2024-03-05

boost::thread 类有一个默认构造函数,它给出“Not-a-thread”,那么什么是

boost::thread t1;

适合什么?我可以给它一个稍后在代码中执行的函数吗?

另一个问题:

我正在尝试编写一个具有分阶段架构(SEDA)的小服务器,每个阶段都有许多工作线程,并且这些阶段与事件队列连接。当我使用 boost::thread_group 创建具有 4 个工作线程的池时,如下所示: (我已经删除了队列上的条件变量以进行清理,并且还假设队列的大小始终为 4N。)

boost::thread_group threads;
while(!event_queue.empty())
{
    for(int i = 0; i < 4; ++i)
    {
        threads.create_thread(event_queue.front());
        event_queue.pop();
    }

    threads.join_all();
}

thread_group 的大小不断增长。组中已完成的线程会发生什么情况以及如何重用这些线程并将 thread_group 大小保持为 4?

i saw 这个问题 https://stackoverflow.com/questions/2659065/c-boost-thread-reusing-threads并使用以下代码代替上面的代码:

std::vector<boost::shared_ptr<boost::thread>> threads;
while(!event_queue.empty())
{
    for(int i = 0; i < 4; ++i)
    {
        boost::shared_ptr<boost::thread> 
            thread(new boost::thread(event_queue.front());
        event_queue.pop();
        threads.push_back(thread);
    }

    for(int i = 0; i < 4; ++i)
        threads[i]->join();

    threads.clear();
}

那么有什么区别,哪一个性能更好呢?会不会出现内存泄漏?或者是否有另一种方法来创建简单的线程池?

我将不胜感激任何帮助。非常感谢。


一种选择是使用 boost asio。看一下线程池的配方:http://think-async.com/Asio/Recipes http://think-async.com/Asio/Recipes。然后,您可以使用 io_service 的 post 方法将事件发布到线程池。

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

boost::thread 并创建它们的池! 的相关文章

  • 可以阻止 cin 等待输入吗?

    在图形应用程序中 我使用控制台输入执行调试命令 创建控制台时 还会创建一个新线程来收集处理所有输入的用户命令 图形应用程序将继续并行运行 我使用 boost thread 库 到目前为止效果很好 但是我还没有找到一个很好的解决方案来停止该线
  • boost asio异步等待条件变量

    是否可以对 boost asio 中的条件变量执行异步等待 读取 非阻塞 如果不直接支持任何有关实现的提示 我们将不胜感激 我可以实现一个计时器 甚至每隔几毫秒就触发一次唤醒 但这种方法要差得多 我发现很难相信条件变量同步没有实现 记录 如
  • Boost.Thread 3.0.0 中的重大变化

    在 Boost 库 1 50 0 版本的发行说明中 我注意到两个重大更改 see here 6266 重大更改 如果可连接 线程析构函数应调用终止 6269 重大更改 如果可连接 线程移动分配应调用终止 这对于我当前使用 Boost 1 4
  • CMake 和 Boost

    我查了一下 发现很多人都有同样的问题 但没有解决办法 我正在使用 CMake 为 MinGW 生成 Makefile 编译时出现错误 CMakeFiles boosttest dir objects a main cpp obj main
  • 使用信号量而不是互斥体对 boost::Lockable 进行建模(以前的标题为:从不同线程解锁互斥体)

    我正在使用 C boost thread 库 在我的例子中这意味着我正在使用 pthreads 正式地 互斥体必须从锁定它的同一个线程解锁 我希望能够锁定一个线程 然后在另一个线程中解锁 有很多方法可以实现这一点 一种可能性是编写一个新的互
  • 为什么友元函数会被定义为结构体的一部分 - boost thread_data?

    我试图理解一些导致 PC Lint 悲伤的 boost 代码 并以一种我认为不合法的 C 方式使用friend关键字 但在 VS2008 中编译正常 我以为我将朋友理解为声明类和函数的一种方式 我认为在这样的函数定义上使用是不合法的 然而
  • 提升线程取消

    您可以像取消 pthread 一样取消 Boost Thread 吗 我正在编写一个简单的看门狗 以便在工作线程崩溃时终止它们 并且似乎没有办法简单地取消 Boost Thread 库中的线程 他们不支持取消 这是一件好事 因为它可能会导致
  • 为什么我可以多次调用 boost::unique_future::get ,而不像 std::future ?

    我知道我们不能打电话std future get很多次 我们应该使用std shared future如果我们需要多次调用它 但我们可以打电话boost unique future get很多次 虽然有boost shared future
  • C++0x没有信号量?如何同步线程?

    C 0x 真的不会有信号量吗 Stack Overflow 上已经有一些关于信号量使用的问题 我一直使用它们 posix 信号量 来让一个线程等待另一个线程中的某个事件 void thread0 doSomething0 event1 wa
  • boost::thread::id 的 tr1::hash 吗?

    我开始使用unordered set类来自tr1命名空间以加速对普通 基于树 STL 的访问map 但是 我想在 boost 中存储对线程 ID 的引用 boost thread id 并意识到这些标识符的 API 非常不透明 以至于您无法
  • boost::thread 并创建它们的池!

    boost thread 类有一个默认构造函数 它给出 Not a thread 那么什么是 boost thread t1 适合什么 我可以给它一个稍后在代码中执行的函数吗 另一个问题 我正在尝试编写一个具有分阶段架构 SEDA 的小服务
  • 使用 BOOST 进程在单独的线程中读取子进程标准输出

    我有一个主程序 它使用 boost 进程库来生成一个打印的子进程 Hello World 每 5 秒在其标准输出上一次 我想在主进程中的子进程的标准输出可用时读取 监视它 并在主程序中执行其他操作 我已经尝试过这些例子boost async
  • linux下用boost::thread创建boost::asio工作线程

    我在 Windows 下使用 boost 一段时间了 现在需要迁移几个现有的应用程序以在 Ubuntu 12 上运行进行演示 该应用程序创建两个工作线程 一个用于记录传入的 UDP 数据 另一个用于侦听单独的端口并将该数据打印到屏幕上 我已
  • boost share_mutex 的示例(多次读取/一次写入)?

    我有一个多线程应用程序 必须经常读取一些数据 并且偶尔会更新数据 现在 互斥体可以安全地访问该数据 但它很昂贵 因为我希望多个线程能够同时读取 并且仅在需要更新时将它们锁定 更新线程可以等待其他线程完成 我想这就是boost shared
  • boost::condition::timed_wait 的使用示例

    有人有如何最轻松地使用 boost condition timed wait 的示例吗 有一些关于该主题的主题here https stackoverflow com questions 2259025 how do i get boost
  • 关闭时 Boost Log 中的 Boost 线程访问冲突

    我有一个使用增强日志记录的应用程序 在关闭期间 它会因空指针访问而发生访问冲突 当我单步执行代码直至失败时 似乎 boost log dll 正在被解除分配 然后 boost thread 代码尝试访问曾经被 log dll 占用的内存 我
  • boost::shared_mutex 多读取器/单写入器互斥体

    我正在尝试使用 boost shared mutex 来实现多读取器 单写入器互斥体 我的问题相当简单 当另一个线程尝试锁定共享互斥体进行写入时 线程是否有可能获得对共享互斥体的读取器访问权限 例如 我有10个线程 只有其中一个可以写 线程
  • (简单)boost thread_group 问题

    我正在尝试编写一个相当简单的线程应用程序 但我对 boost 的线程库很陌生 我正在开发的一个简单的测试程序是 include
  • 使用 boost::thread 特定的 ptr<>::get() 是否会很慢?有什么解决方法吗?

    我目前正在使用 Valgrind 的 Callgrind 分析一个存在性能问题的应用程序 在查看分析数据时 似乎有 25 的处理时间花费在boost detail get tss data在主要目的是物理模拟和可视化的应用程序中 get t
  • 提升条件变量 - 对“notify_one”的调用是否堆栈?

    在使用 Boost 线程的单个生产者 单个消费者应用程序中 如果生产者线程多次调用cond var notify one 在消费者线程调用之前cond var wait lock 是否会额外致电notify one被堆叠起来 这样每次调用

随机推荐

  • ASP.Net:在编辑和删除时从 GridView 获取 DataKey

    我正在使用一个GridView控件数据绑定到List从实用程序方法返回的对象的数量 这GridView控件将其中一列设置为其 DataKey 当一行是Selected 它会触发 Selected 事件处理程序 我可以使用myGridView
  • javascript 检测桌面触摸和鼠标支持

    触控设备应如何区分纯触控设备和带有鼠标的设备 就像今天的一些笔记本电脑 需要在应用程序中给予所有鼠标功能优先级 并且如果运行应用程序的设备仅支持触摸 则需要更改功能 如果触摸设备也有鼠标指针 逻辑建议应用程序应将该设备视为普通桌面 并且也可
  • array.map() 中花括号的含义[重复]

    这个问题在这里已经有答案了 我有一个 map 改变的函数isActive对象的属性值data大批 然而 用大括号包裹它会返回未定义的结果 而用括号包裹它或不包裹它会返回更新后的值 大括号用作箭头函数中的包装器 但它对于 map 的工作方式是
  • zod TypeError:无法读取未定义的属性(读取“_parse”)

    我有一个使用 Zod 的 Vite 库 我想解析配置 我的文件夹结构与配置对象结构类似 index ts文件始终导出其自己目录中的所有文件及其子目录中的所有内容 例如export from subDir 所以根文件导出 整个库 以下设置显示
  • 批处理文件将部分文件名移动到部分文件夹名称字符串

    我有一个充满文件夹的目录 这些文件夹以这种方式命名 ABC L2 0001 2ABC12345 0101 xxxx 我需要将许多以此方式命名的文件移动到与文件的前 9 个字符匹配的文件夹中 2ABC12345 0101 xyxyxyx yx
  • 如何在 MSBuild 中并行运行任务

    除非我严重误解了 MSBuild 否则任务将按照它们在 目标 节点中出现的文档顺序执行 我希望能够指定两个任务 例如 xcopy 任务 可以并行运行 我期待有一个 并行 任务或其他任务 尝试 MSBuild 扩展包中的新并行任务 http
  • 使用 .htaccess 更改 url 中的目录

    我正在尝试更改地址栏中显示的网址mysite com blog wedding hair to mysite com services wedding hair using htaccess 使用以下答案 https stackoverfl
  • 带负值和高度的 CSS 相对定位

    我试图对 DIV 元素进行负向定位 在示例中是 content 但我的问题是 div 的容器 wrapper2 获得了太多高度 实际上是 content 给出的高度 但正如我 我将内容向上移动 我想相应地降低 wrapper2 的高度 在这
  • 删除 MVC 中的浏览器自动完成功能

    我目前正在尝试删除用户浏览器完成的表单自动完成功能 这可能会导致一些关键行为 因为它填充了密码字段 我已经将自动完成属性添加到我的所有文本框字段中 但是当我尝试使用 Firefox 时 它仍然会将我当前的登录信息加载到字段中 有谁知道如何解
  • JScrollPane 未添加到 JTextArea

    我看到了几个类似这个问题的问题 但我无法解决这个问题 我无法得到JScrollPane可见于JTextArea 谁能指出我哪里做错了 谢谢 package experiement import java awt Dimension impo
  • openlayers 策略:ol.loadingstrategy.bbox 不适用于 wfs 功能

    我尝试使用此代码使用 openlayers 4 最大 1000 可视化 wfs 中的地块 但是视图地图的每次移动或缩放时范围不会改变 或者新功能不会加载到图层中 var parcellaireSource new ol source Vec
  • MinGW GCC:“未知转换类型字符'h'”(snprintf)

    好的 我在 Windows 7 上使用 MinGW GCC 4 6 2 编译 C 文件时遇到了一个奇怪的问题 该文件包含以下 C 代码 include
  • 无法访问在 docker 内创建的 docker-compose 容器

    我有一个docker compose yml在端口上启动简单 HTTP 回显服务的文件8800 version 2 services echo server image luisbebop echo server container nam
  • CSS 比较运算符

    我需要定位占其父 div 80 以上的 div 作为进度条 考虑到我们可以瞄准specificCSS 宽度 data width 80 我们如何瞄准比较 这做到了not在 Firefox 或 Chrome 中工作 data width gt
  • Powershell / Perl:将多个 CSV 文件合并为一个?

    我有以下 CSV 文件 我想将它们合并到一个 CSV 中 01 csv apples 48 12 7 pear 17 16 2 orange 22 6 1 02 csv apples 51 8 6 grape 87 42 12 pear 2
  • 如何在Windows系统上安装geckodriver

    我正在尝试安装 webdriver 为了打开 Firefox 我需要安装 geckodriver 并将其安装在正确的路径中 首先 安装 geckodriver 的下载链接仅允许您安装非可执行文件 那么有没有办法让它成为可执行文件呢 其次 我
  • 无法探测视频 laravel ffmpeg

    我一直在关注这个教程https github com pascalbaljetmedia laravel ffmpeg https github com pascalbaljetmedia laravel ffmpeg我正在尝试调整我的视频
  • 具有相同名称的多个隐藏输入,始终检索最后一个输入[重复]

    这个问题在这里已经有答案了 foreach graphEdge as graphNode echo div class form check mb 3 div
  • 使用 Camel 的表达式语言获取并格式化昨天的日期

    我在 Camel 的路径中使用日期 fileName date now dd MM yyyy 但我现在需要的是 1天 那可能吗 嗯 不直接 简单语言中的 date 对象只能获取当前时间 或者您放置在标头中的某个时间值 您可以在 java 或
  • boost::thread 并创建它们的池!

    boost thread 类有一个默认构造函数 它给出 Not a thread 那么什么是 boost thread t1 适合什么 我可以给它一个稍后在代码中执行的函数吗 另一个问题 我正在尝试编写一个具有分阶段架构 SEDA 的小服务