无优先级反转的环形缓冲区
|
我有一个高优先级的流程,需要将数据传递给低优先级的流程。我已经编写了一个基本的环形缓冲区来处理数据传递:
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()中进行数学运算或更新为最终不是原子的,引入了错误。
我可以在开始和结束的访问周围放置一个互斥锁,但是如果高优先级线程必须等待低优先级线程获取的锁,则会导致优先级反转。
我也许可以使用原子操作来解决一些问题,但是我不知道提供这些功能的一个不错的跨平台库。
是否有标准的环形缓冲区设计可以避免这些问题?
没有找到相关结果
已邀请:
3 个回复
才改隘瘁
和
的更新和访问都是原子的。这可能是自动的,例如Microsoft声明: 简单的读写 正确对齐的32位变量是 原子操作。换句话说,你 不会只剩下一部分 更新的变量;所有位都是 以原子方式更新。 您可以考虑到即使您获得了价值,ѭ5可能已经过时了。在阅读线程中,ѭ5将返回您可以依靠的最小计数;因为写线程“ 5”将返回最大计数,而真实计数可能会更低。
翰冒绢县
队辅坟阮阶
在
中提供跨平台原子功能