与简单读取变量相比,使用memory_order_relaxed的atomic_load()是否会引入任何额外的开销?

时间:2012-09-07 08:51:48

标签: c++ c c++11 atomic c11

我没有看到任何“原生”CPU积分额外开销的原因,但我可能错了, 所以我想听听社区的意见

我真正的问题涉及某种链接列表,这种链接列表相对罕见,但却被忽略了(类似于典型的RCU用例)。我们的想法是为只读操作提供2种访问模式:如果结构现在正在改变(完全无锁定算法),则使用第一种模式;对于“平静”情况(使用非原子列表遍历),使用第二种轻量模式。对于第二个(轻量级)情况,我将使用带有memory_order_relaxed的原子加载,但如果它太昂贵,我需要做一些解决方法(在非原子变量中使用原子值,或以某种方式模拟提出的memory_order_nonatomic { {3}}等等。)

我理解答案取决于原子实现(和CPU),但我希望实现应该合理地运行:)

1 个答案:

答案 0 :(得分:3)

memory_order_relaxed模型只允许存储/加载操作重新排序,但它仍然强制执行原子读/写操作。在一些CPU架构上,它将导致总线锁定,缓存刷新等。所以通常答案是肯定的 - 使用memory_order_relaxed的原子访问应被视为比非原子访问更昂贵。