Почему InterlockedCompareExchange не возвращает измененное значение? - PullRequest
0 голосов
/ 08 декабря 2011
LONG __cdecl InterlockedCompareExchange(
  __inout  LONG volatile *Destination,
  __in     LONG Exchange,
  __in     LONG Comparand
);

Возвращаемое значение
Функция возвращает начальное значение параметра Destination.

Просто любопытно.
Почему InterlockedCompareExchange возвращает начальное значение? Есть ли причина, по которой они спроектированы так?

Ответы [ 2 ]

5 голосов
/ 20 января 2015

Потому что это дает вам больше информации. Если вы знаете только измененное значение и оно равно Exchange, начальное значение может быть Exchange или Comparand.

1 голос
/ 08 декабря 2011

Вот хороший пример из 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;
    }

Понимаете ли вы, почему важно сохранять первоначальное значение?

...