我有一个高优先级进程需要向低优先级进程传递数据。我编写了一个基本的环形缓冲区来处理数据传递:
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;
};
这里有一个问题。假设低优先级进程有一个 oracle,可以准确地告诉它需要读取多少数据,以便不必调用
count()
。那么(除非我漏掉了什么),就没有并发问题。然而,一旦低优先级线程需要调用 count()
(高优先级线程可能也想调用它来检查缓冲区是否已满),就有可能导致 count() 函数中的数学运算或对 end 的更新不是原子操作,从而引入漏洞。我可以在对 start 和 end 的访问周围放置一个互斥锁,但如果高优先级线程必须等待低优先级线程获取的锁,则会导致优先级反转。
我可能可以使用原子操作来解决这个问题,但我不知道是否有一个很好的、跨平台的库可以提供这些操作。
是否有一个标准的环形缓冲区设计可以避免这些问题?