gpt4 book ai didi

c++ - 没有优先级反转的环形缓冲区

转载 作者:可可西里 更新时间:2023-11-01 17:52:31 25 4
gpt4 key购买 nike

我有一个高优先级进程需要将数据传递给低优先级进程。我写了一个基本的环形缓冲区来处理数据的传递:

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() 中的数学运算或结束更新不是原子的,因此引入了错误。

我可以在开始和结束的访问周围放置一个互斥锁,但如果高优先级线程必须等待低优先级线程获取锁,这会导致优先级倒置。

我也许可以使用原子操作来解决问题,但我不知道有一个不错的跨平台库可以提供这些操作。

是否有标准的环形缓冲区设计可以避免这些问题?

最佳答案

只要您遵守以下准则,您所拥有的应该没问题:

  • 只有一个线程可以写入。
  • 只有一个线程可以读取。
  • startend 的更新和访问是原子的。这可能是自动的,例如 Microsoft 声明:

Simple reads and writes to properly-aligned 32-bit variables are atomic operations. In other words, you will not end up with only one portion of the variable updated; all bits are updated in an atomic fashion.

  • 您考虑到 count 可能已过时这一事实,即使您获得了值。在阅读线程中,count 将返回您可以依赖的最小 计数;对于写入线程,count 将返回最大 计数,而真实计数可能会更低。

关于c++ - 没有优先级反转的环形缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5746559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com