1

我有以下结构

struct info {
 unsigned long a;
 unsigned long b;
};

atomic <info> data;

由写入线程和读取线程使用。读者必须尽快对新值做出反应。为此,我在阅读器中实现了以下内容:

while (true) {
  auto value = data.load();
  // do some operations given these new values
}

此操作非常占用处理器资源。我选择了这种方法,因为我相信它比使用条件变量然后在数据更改时等待读取器线程被唤醒要快。此外,数据更新非常频繁,每秒数百次。有没有更好的方法来做到这一点,同时仍然具有最快的反应时间?

4

1 回答 1

4

信号量确实是让写入器发出新数据信号的好选择,而读取器在数据准备好被使用时唤醒。但是,对于高性能场景,您应该考虑使用无锁队列,例如Moody Camel编写的队列。这样的队列允许写入者在不阻塞读取器的情况下添加新数据条目,并且读取器可以尽可能快地获取数据,而不会阻塞写入器。这样,如果数据可用,则可以以最大速度处理数据,否则不会消耗 CPU 资源。

于 2019-04-29T19:49:18.590 回答