为啥 InterlockedCompareExchange 不返回更改的值?

Posted

技术标签:

【中文标题】为啥 InterlockedCompareExchange 不返回更改的值?【英文标题】:Why doesn't InterlockedCompareExchange return changed value?为什么 InterlockedCompareExchange 不返回更改的值? 【发布时间】:2011-12-08 05:02:40 【问题描述】:
LONG __cdecl InterlockedCompareExchange(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

返回值 该函数返回 Destination 参数的初始值。

只是好奇。 为什么 InterlockedCompareExchange 返回 initial 值?他们这样设计有什么原因吗?

【问题讨论】:

【参考方案1】:

因为这可以为您提供最多的信息。如果您只知道更改后的值,并且恰好等于Exchange,则初始值可能是Exchange,也可能是Comparand

【讨论】:

【参考方案2】:

这是来自 MSDN 的一个很好的例子:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683560%28v=vs.85%29.aspx

    for(;;)
    
        // calculate the function
        new_value = Random(old_value);

        // set the new value if the current value is still the expected one
        cur_value = InterlockedCompareExchange(seed, new_value, old_value);

        // we found the expected value: the exchange happened
        if(cur_value == old_value)
            break;

        // recalculate the function on the unexpected value
        old_value = cur_value;
    

你明白为什么能够保留初始值很重要吗?

【讨论】:

你再给我一点解释就更好了。不管怎样,我终于明白了。谢谢。

以上是关于为啥 InterlockedCompareExchange 不返回更改的值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?