InterlockedIncrement vs InterlockedIncrementAcquire vs Inter

InterlockedIncrement vs InterlockedIncrementAcquire vs InterlockedIncrementNoFence

本文关键字:vs Inter InterlockedIncrementAcquire InterlockedIncrement      更新时间:2023-10-16

有人能解释一下这三种原子操作的区别吗?

  • InterlockedIncrement
  • InterlockedIncrementAcquire
  • InterlockedIncrementNoFence

我似乎找不到任何文档说明它们的意思,除了"uses acquire symantecs",我不理解。

谢谢。

离开文档,

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

然而,这可能破坏并行程序中的逻辑,因此有时需要内存屏障。它们很昂贵:它们的成本往往和缓存丢失一样多。

InterlockedIncrementAcquire尝试使用"获取语义",如果你的系统支持,如果不支持,它回落到InterlockedIncrement。从那篇博文开始,

Acquire语义防止read- Acquire在程序顺序中与它后面的任何读或写操作进行内存重排序

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

最后,InterlockedIncrementNoFence不生成内存屏障——它是完全未检查的,并且它可能会导致顺序一致性问题。