c++ - 使用处理 IO 队列的线程提升线程池

标签 c++ multithreading c++11

我最近开始尝试使用 pseudo-boost threadpool (伪,因为它还没有被正式接受)。

作为一个简单的练习,我用最多两个线程初始化了线程池

每个任务做两件事:

  • CPU 密集型计算
  • 将结果写入磁盘

问题

如何将模型修改为执行以下操作的线程池:

  • CPU 密集型计算

和一个单个 I/O 线程,它从线程池中监听完成 - 获取结果内存并简单地:

  • 将结果写入磁盘

Should I simply have the task communicate to the I/O thread (spawned as std::thread) through a std::condition_variable (essentially a mutexed queue of calculation results) or is there a way to do it all within the threadpool library?

Or is the gcc 4.6.1 implementation of future and promise mature enough for me to pull this off?

回答

看起来很简单 mutex queue with a condition variable工作正常。

除了使用线程池之外,通过对读取访问和写入进行分组,我还获得了以下改进:

  • 2 核机器:1h14m 缩短到 33m(运行时间缩短 46%)
  • 4 核虚拟机:40m 降至 18m(运行时间减少 55%)

感谢 Martin James 深思熟虑的回答。在这个练习之前,我认为我的下一个计算服务器应该有双处理器和大量内存。但是现在,由于多核和超线程具有如此强大的处理能力,我意识到花钱解决 I/O 瓶颈可能会更好。

正如 Martin 所提到的,拥有多个驱动器或 RAID 配置可能会有所帮助。我还将研究在内核级别调整 I/O 缓冲区设置。

最佳答案

如果只有一个本地磁盘,我最喜欢生产者-消费者队列末端的一个写入线程。寻道、网络磁盘延迟和其他问题不会让任何已完成计算的池线程在尝试写入磁盘时卡住。如果只有一个线程正在访问其他磁盘操作(例如,选择另一个位置/文件/文件夹),它也会更容易/更快 - 队列将占用空闲时间并允许在延迟期间进行无缝计算。

直接从计算任务写入或将结果写入作为单独的任务提交都可以,但您需要池中有更多线程才能实现无暂停操作。

如果有多个磁盘,一切都会改变。由于整体性能的提高,多于一个编写器线程将成为一个有值(value)的提议。然后我可能会使用队列/写入线程的数组/列表,每个磁盘一个。

关于c++ - 使用处理 IO 队列的线程提升线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611923/

相关文章:

c++ - 非阻塞并发编程是真的吗?

java - 多线程程序中的Swing图形

c++ - 循环时持有对 unique_ptr 的引用

c++ - 为 Vim 调整 C++ IDE 插件

c++ - 隐藏存储在哪里?

c++ - 防止为字符串流提取运算符 (>>) 不支持的类型实例化模板类

c++ - OpenGL窗口总是忙

C++整数奇数/偶数计数器问题

c# - 锁定操作不起作用

c++ - 删除 move 构造函数并从右值构造对象