旋转等待C ++ 11

时间:2019-04-29 19:36:11

标签: c++ c++17 spinlock stdatomic spinwait

我有以下结构

- name: Refresh the inventory
  meta: refresh_inventory

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

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

atomic <info> data;

此操作非常耗费处理器资源。我之所以选择这种方法,是因为我认为它比使用条件变量然后在数据更改时等待读取器线程唤醒的速度要快。而且,数据更新非常频繁,每秒数百次。在仍然具有最快的反应时间的同时,还有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

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