用于免等待生产者和阻塞使用者的环形缓冲区
Ring buffer for a wait-free producer and a blocking consumer
我有一个生产者线程,它以可能(暂时(太快的速度生成对象,使用者线程无法使用。因此,我想要一个 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
};
能够就地修改元素会很好。它还可以使用缓冲区的动态分配(例如,size 被传递给构造函数,缓冲区是一个unique_ptr
(。
现在回答我的问题。这件事甚至可能吗(至少在 x86 上(?
- 如果是,它将如何工作?我真的很想要一些实现,最好但不一定C++。
- 如果没有,为什么不呢?
指向相关材料的指针,即使它不能完全满足我的需求,也将不胜感激。
一种解决方案是使用具有您自己的信令和阻塞的增强单生产者单消费者队列。
谷歌发现了这个,不知道它,但也许值得研究:
免等待多生产者多使用者环形缓冲区:
https://www.osti.gov/servlets/purl/1531271
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 用于免等待生产者和阻塞使用者的环形缓冲区
- 具有单个生产者单一使用者的无锁循环缓冲区
- 多线程使用者未产生与使用升压环形缓冲区的输入相同的输出
- 交换缓冲区而不锁定单个生产者和多个使用者
- 使用提升线程和循环缓冲区挂起的生产者/使用者