为什么InterlockedCompareExchange没有返回更改的值?

时间:2011-12-08 05:02:40

标签: windows winapi synchronization atomic interlocked

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

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

好奇 为什么InterlockedCompareExchange返回初始值?他们设计的原因是否有原因?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

这是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;
    }

您是否明白为什么能够保留初始值非常重要?