InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence

时间:2014-08-25 13:47:01

标签: c++ c windows synchronization atomic

有人可以解释这三种原子操作之间的区别吗?

  • InterlockedIncrement
  • InterlockedIncrementAcquire
  • InterlockedIncrementNoFence

除了“使用获取的赛门铁克”之外,我似乎无法找到任何文件。

感谢。

1 个答案:

答案 0 :(得分:2)

取消文档,

InterlockedIncrement"生成full memory barrier"每次通话。内存屏障是CPU的特殊指令,可以防止它像往常那样重新排序操作 - 例如,加载操作可能非常昂贵,因此如果操作流看起来像"添加到A,则添加到A ,加载B,添加到B",CPU将尝试将其重新排序为"加载B,添加到A,添加到A,添加到B"这样B的负荷就需要时间才能完成。

然而,这可能会破坏并行程序中的逻辑,因此有时需要内存障碍。它们非常昂贵:它们的成本往往与缓存未命中的成本差不多。

InterlockedIncrementAcquire尝试使用" acquire semantics"如果你的系统支持,如果没有,它会回退到InterlockedIncrement。离开那篇博文,

  

获取语义可防止读取采集的内存重新排序,并按程序顺序执行任何读取或写入操作

因此,获取语义是一种有限的,较便宜的内存屏障,仅在某些情况下有用(当只涉及读取时,显然)。

最后,InterlockedIncrementNoFence不会产生任何内存障碍 - 它完全未经检查,并且可能会导致顺序一致性问题。