供无等待的生产者和阻塞的消费者使用的环形缓冲区

时间:2018-08-09 14:13:27

标签: c++ multithreading producer-consumer lock-free wait-free

我有一个生产者线程,其生成对象的速率可能(暂时)太快,以至于消费者线程无法使用。因此,我想要一个FIFO来缓冲剩余的工作。一旦FIFO已满,生产者应简单地退出或稍后重试。另外,我希望能够通知消费者不再要做任何工作(无需将特殊对象排队到FIFO中)。生产者不会放慢速度,消费者也不会浪费CPU周期,因此我有以下要求:

  • 固定大小的圆形环形缓冲区。
  • 生产者永远不要等待:它需要能够尽快入队。
  • 消费者应能够阻止:无需忙于等待可能缓慢的生产者。混合锁会很好。

我正在预想以下C ++类:

template <typename T, std::size_t N>
class spsc_circular_half_blocking {
    std::array<T, N> buffer;
    // bookkeeping, atomics, mutexes etc. go here
public:
    bool try_push(const T&); // returns whether object could be enqueued
    void notify(); // notifies consumer
    bool wait_pop(T&); // returns whether object was dequeued or notification was received
};

能够就地修改元素会很好。它还可以使用缓冲区的动态分配(例如,将大小传递给构造函数,缓冲区为unique_ptr)。

现在我的问题。这件事是否可能(至少在x86上)?

  • 如果是,它将如何工作?我真的想要一些实现,最好是但不一定是C ++。
  • 如果没有,为什么不呢?

即使不完全满足我的需求,也要对相关材料提出建议。

2 个答案:

答案 0 :(得分:3)

一种解决方案是将boost single-producer single-consumer queue与您自己的信令和阻塞一起使用。

答案 1 :(得分:0)

谷歌发现了这个,不知道但值得研究一下:

无需等待的多生产者多消费者环形缓冲区:

https://www.osti.gov/servlets/purl/1531271