我有一个需要将数据传递给低优先级进程的高优先级进程。我编写了一个基本的环形缓冲区来处理数据的传递:
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() 中的数学运算或更新可能会结束不是原子的,引入了一个错误。
我可以在开始和结束的访问周围放置一个互斥锁,但是如果高优先级线程必须等待低优先级线程获取的锁,这将导致优先级反转。
我也许可以使用原子操作解决一些问题,但我不知道有一个很好的跨平台库提供这些。
是否有避免这些问题的标准环形缓冲区设计?