我有一个生产者线程,其生成对象的速率可能(暂时)太快,以至于消费者线程无法使用。因此,我想要一个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
};
能够就地修改元素会很好。它还可以使用缓冲区的动态分配(例如,将大小传递给构造函数,buffer为unique_ptr
)。
现在我的问题。这件事是否可能(至少在x86上)?
即使不完全满足我的需求,相关材料的指针也将不胜感激。
一种解决方案是将boost单生产者单消费者队列与您自己的信令和阻塞一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句