8

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(),

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

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

谢谢!

4

2 回答 2

10

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

MSDN 有一篇关于Acquire and Release SemanticsInterlocked* API的文章以及这篇很棒的博客文章。Linux内存屏障文档也可能有用...

于 2012-03-19T02:37:18.853 回答
1

我在 MSDN 上找到了这个这个:

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

于 2012-03-19T02:29:50.253 回答