3

我有一个生产者线程,它产生对象的速度可能(暂时)太快以至于消费者线程无法消费。因此,我想要一个 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
};

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

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

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

指向相关材料的指针,即使它不能完全满足我的需求,也将不胜感激。

4

2 回答 2

4

一种解决方案是使用boost 单生产者单消费者队列以及您自己的信令和阻塞。

于 2018-08-09T15:21:26.893 回答
0

谷歌发现了这一点,对此一无所知,但也许值得研究一下:

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

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

于 2021-05-22T06:10:53.660 回答