【问题标题】:What's the difference between InterlockedCompareExchange Release() and Acquire()?InterlockedCompareExchange Release() 和 Acquire() 有什么区别?
【发布时间】:2012-04-03 14:02:11
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: winapi synchronization interlocked


    【解决方案1】:

    我在 MSDN 上找到了 thisthis

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 2010-10-30
        • 2016-04-11
        • 2020-02-22
        • 2011-12-30
        • 2011-03-15
        • 1970-01-01
        相关资源
        最近更新 更多