C++ - 生产者/消费者只允许消费定义的 block

标签 c++ multithreading c++11 thread-safety producer-consumer

有两个线程A(生产者)和B(消费者)。

A 产生的数据只能以 block 的形式读取,因此B 只允许读取一次A 产生了一整 block 。 单条数据是一个简单的结构, block 长度是可变的。比如一次可能是B在产生50条数据后允许读取,另一次可能是200条。

我找到了我想使用的生产者/消费者队列的这个实现: https://github.com/cameron314/readerwriterqueue

我目前的想法是,A 将其数据写入 std::vector,然后将 std::vector 传递到队列中。但我怀疑这是否可行,因为队列不知道 std::vector 将占用多少内存,并且它想预先分配内存。

我希望任何人都知道一个更简单的解决方案。

最佳答案

无论您生产或消费什么,您都需要一个并发队列来在生产者和消费者之间进行通信。如果我们用 C++ 风格来做,你最终会得到类似这样的东西:

template<typename T, typename Alloc>
class concurrent_queue;

(请注意,某些库已经为您提供了此类容器,例如 Intel TBB)。

模板参数T是你在生产者和消费者之间交换的东西。当你要求消费 block 时,这里 T = your_chunk_type .假设您的 block 大小可变:Chunk = std::vector<something> .使用您在 github 上链接的库,您可以使用 ReaderWriterQueue<Chunk>作为共享工作的队列。

关于C++ - 生产者/消费者只允许消费定义的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35064543/

相关文章:

java - 线程和中断: Continue or exit?

c++ - std::move 可以移动内置类型或 c 指针或数组吗

C++ lambda,没有看到函数和参数?

c++ - 你知道的最难理解的 C++ 代码是什么?

C++输出数组中的最高元素

c# - 在C#或Java中实现大规模并行计算引擎的线程替代方法?

C++11 (g++ thread sanitized) 用原子排序非原子操作(误报?)

c++ - 建筑 PCL : pcl_kdtree 'left of .serialize must have class/struct/union'

c++ - 支持 CUDA 统一内存系统分配器的操作系统版本?

java - 线程的 run 方法完成后创建另一个线程