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()
,
使用释放内存访问语义执行交换。
所以我很好奇这两个功能之间的区别。 何时使用获取内存访问语义或发布内存访问语义? 有没有例子?
谢谢!
答案 0 :(得分:9)
普通版本使用完整屏障,而后缀版本仅处理或负载,这在某些CPU(基于Itanium的处理器等)上可能更快
MSDN上有一篇关于Acquire and Release Semantics和Interlocked* API以及this great blog post的文章。 Linux memory barrier documentation也可能有用......
答案 1 :(得分:1)