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

时间:2012-03-19 02:13:27

标签: winapi synchronization interlocked

InterlockedCompareExchangeRelease()InterlockedCompareExchangeAcquire()之间的区别是什么?

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

LONG __cdecl InterlockedCompareExchangeRelease(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

LONG __cdecl InterlockedCompareExchangeAcquire(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

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

  

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

但是InterlockedCompareExchangeAcquire()

  

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

InterlockedCompareExchangeRelease()

  

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

所以我很好奇这两个功能之间的区别。 何时使用获取内存访问语义发布内存访问语义? 有没有例子?

谢谢!

2 个答案:

答案 0 :(得分:9)

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

MSDN上有一篇关于Acquire and Release SemanticsInterlocked* API以及this great blog post的文章。 Linux memory barrier documentation也可能有用......

答案 1 :(得分:1)

我在MSDN上找到了thisthis

  

获取内存语义指定在尝试任何其他内存操作之前,当前线程正在执行的内存操作将可见。释放存储器语义指定在完成所有其他存储器操作之后,当前线程正在执行的存储器操作将是可见的。这些语义允许您强制按特定顺序执行内存操作。在进入受保护区域时使用获取语义,并在离开时释放语义。