【发布时间】:2011-04-21 15:51:35
【问题描述】:
我有一个高优先级进程,需要将数据传递给低优先级进程。我编写了一个基本的环形缓冲区来处理数据的传递:
class RingBuffer {
public:
RingBuffer(int size);
~RingBuffer();
int count() {return (size + end - start) % size;}
void write(char *data, int bytes) {
// some work that uses only buffer and end
end = (end + bytes) % size;
}
void read(char *data, int bytes) {
// some work that uses only buffer and start
start = (start + bytes) % size;
}
private:
char *buffer;
const int size;
int start, end;
};
这就是问题所在。假设低优先级进程有一个预言机准确地告诉它需要读取多少数据,因此永远不需要调用count()。然后(除非我遗漏了什么)没有并发问题。然而,一旦低优先级线程需要调用count()(高优先级线程可能也想调用它来检查缓冲区是否太满),count() 中的数学运算或更新到 end 不是原子的,引入了一个错误。
我可以在开始和结束的访问周围放置一个互斥锁,但如果高优先级线程必须等待低优先级线程获取的锁,这将导致优先级反转。
我也许可以使用原子操作解决一些问题,但我不知道有一个很好的跨平台库可以提供这些。
是否有避免这些问题的标准环形缓冲区设计?
【问题讨论】:
-
您对使用的平台有什么限制吗?
-
@Peter 让我们假设 x86(IIRC 32 位写入对齐地址是原子的)虽然越便携越好。
-
这里是一个队列,它的运行主要是免等待software.intel.com/en-us/articles/…
标签: c++ concurrency circular-buffer