InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence [重复]

Posted

技术标签:

【中文标题】InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence [重复]【英文标题】:InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence [duplicate] 【发布时间】:2014-08-25 13:47:01 【问题描述】:

谁能解释这三个原子操作之间的区别?

互锁增量 InterlockedIncrementAcquire InterlockedIncrementNoFence

除了我不理解的“uses acquire symantecs”之外,我似乎找不到任何关于它们含义的文档。

谢谢。

【问题讨论】:

所以你真正的问题是'什么是获取语义'。你为什么不问那个 很惊讶你错过了然后 MSDN 页面可疑地标题为Acquire and Release semantics。 【参考方案1】:

关闭文档,

InterlockedIncrement“为每个调用生成一个full memory barrier”。内存屏障是对 CPU 的特殊指令,可防止它像通常那样重新排序操作——例如,加载操作可能非常昂贵,因此给定一个看起来像“添加到 A,添加到 A,加载 B”的操作流, 添加到 B”,CPU 将尝试将其重新排序为“加载 B,添加到 A,添加到 A,添加到 B”,以便 B 的加载有时间在需要之前完成。

但是,这会破坏并行程序中的逻辑,因此有时内存屏障是必要的。它们很昂贵:它们的成本往往与缓存未命中一样多。

InterlockedIncrementAcquire 如果您的系统支持,则尝试使用“acquire semantics”,如果不支持,则回退到 InterlockedIncrement。离开那篇博文,

Acquire 语义可防止读取-acquire 的内存重新排序,并按照程序顺序进行任何读取或写入操作

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

最后,InterlockedIncrementNoFence 不会产生内存屏障——它完全没有被检查,它可能会导致您出现顺序一致性问题。

【讨论】:

感谢您提供详细信息。我想我真的不了解 Acquire / Release symantecs。我在这里发布了一个后续问题:***.com/questions/25740313/…

以上是关于InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence [重复]的主要内容,如果未能解决你的问题,请参考以下文章

InterlockedIncrement 与 EnterCriticalSection/counter++/LeaveCriticalSection

如何在没有内存屏障的情况下实现 InterlockedIncrement

InterLockedIncrement and InterLockedDecrement函数原理

联锁读取 64 位变量

PHP 数组——方括号 vs 花括号($array[$i] vs $array$i)

javascript i++ vs ++i [重复]