C++:当每个线程都应该同时执行 I/O 和 CPU 密集型任务时的多线程设计

标签 c++ multithreading design-patterns

我有一种情况,我正在将我的工作卸载到线程。两部分的“工作”折衷:

  • 首先压缩给定的数据缓冲区
  • 然后将压缩后的数据写入磁盘

我的主线程不断地创建许多数据缓冲区。

我最初考虑的是线程池设计,但可能池中的所有线程都在等待 I/O。

如果我在每次创建新 dataBuffer 时都创建一个新线程,我会看到创建了大量线程。这可能会有内容切换的开销,但由于上下文切换,我的 CPU 周期不会被浪费。

管理这种情况的好的设计是什么?

最佳答案

如果我能帮上忙,让我试试。

1. First compress the given data buffer
2. Then write the compressed data to disk

我从您那里了解到您生成了数据缓冲区,您需要将其压缩并存储到磁盘中。

如果顺序很重要并且数据源不是时间密集型的,则不会 松散数据直到下一个周期,然后你可以有下面的方法。

线程A

生成数据缓冲区

向线程 B 发出信号,说明您有数据。

线程B

等待线程A的信号

检索数据并压缩。

向线程 C 发出信号以存储它。

线程 C

等待线程B的信号

检索压缩数据,并存储到磁盘中。

关于C++:当每个线程都应该同时执行 I/O 和 CPU 密集型任务时的多线程设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34736331/

相关文章:

c++ - 如何在 C++ 中读取和解析 CSV 文件?

c++ - 苹果、橘子和指向最派生的 c++ 类的指针

c++ - 是否可以让一个 vector 指向其他 vector 的子集?

qt - qt继承的信号不会到达插槽

c++ - 当定义为模板参数时,编译器如何推断数组大小?

java - 这是否违反了 EJB 限制?

multithreading - 为什么 Google App Engine 任务可以虚假地执行多次?

c# - CQRS - 避免切换大小写来调用命令处理程序

python - 设计类结构的方法

design-patterns - EventListener 是 Observable 吗?