我有一个生产者线程,它产生对象的速度可能(暂时)太快以至于消费者线程无法消费。因此,我想要一个 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++。
- 如果没有,为什么不呢?
指向相关材料的指针,即使它不能完全满足我的需求,也将不胜感激。