InterlockedCompareExchange Release()和Acquire()之间有什么区别?

Cel*_*ebi 6 winapi synchronization interlocked

InterlockedCompareExchangeRelease()和之间有什么区别InterlockedCompareExchangeAcquire()

当我尝试使用WIN32 API学习同步函数时,我发现有两个名称不同的函数,但似乎做同样的事情:

LONG __cdecl InterlockedCompareExchangeRelease(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);
Run Code Online (Sandbox Code Playgroud)

LONG __cdecl InterlockedCompareExchangeAcquire(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);
Run Code Online (Sandbox Code Playgroud)

我检查MSDN,它说这些功能是:

对指定的值执行原子比较和交换操作.该函数根据比较结果比较两个指定的32位值并与另一个32位值进行交换.

但对于InterlockedCompareExchangeAcquire(),

使用获取内存访问语义执行操作.

并且InterlockedCompareExchangeRelease(),

使用释放内存访问语义执行交换.

所以我很好奇这两个功能之间的区别.何时使用获取内存访问语义释放内存访问语义?有什么例子吗?

谢谢!

And*_*ers 9

普通版本使用完整屏障,而后缀版本仅处理加载存储,这在某些CPU(基于Itanium的处理器等)上可能更快

MSDN有一篇关于Acquire和Release Semantics以及Interlocked*API的文章以及这篇精彩的博客文章.在Linux内存屏障文件也可能是有用的...