Во-первых, у нас есть InterlockedExchange64();Непоследовательная документация MSDN для функций/встроенных функций InterlockedExchange()?
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683593%28v=vs.85%29.aspx
LONGLONG __cdecl InterlockedExchange64(__inout LONGLONG volatile *Target, __in LONGLONG Value);
Во-вторых, у нас есть компилятор характеристическая, _InterlockedExchange64(), обратите внимание на отсутствие летучих;
http://msdn.microsoft.com/en-us/library/1s26w950%28v=vs.80%29.aspx
__int64 _InterlockedExchange64(__int64 * Target, __int64 Value);
Далее, мы имеем InterlockedExchangePointer(), который, как InterlockedExchange64(), использует летучий.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683609%28v=vs.85%29.aspx
PVOID __cdecl InterlockedExchangePointer(__inout PVOID volatile *Target, __in PVOID Value);
Но теперь мы приходим к внутреннему для обмена указателей, _InterlockedExchangePointer() и здесь мы видим, летучими используются!
http://msdn.microsoft.com/en-us/library/853x471w.aspx
void * _InterlockedExchangePointer(void * volatile * Target, void * Value);
Основная инструкция одинакова во всех случаях, так что это дает? ошибка документации?
GCC instrincs не упоминает volatile для обмена, но тогда они не упоминают его для CAS! так что это не помогает.
Мое мнение, что цель CAS нестабильна, потому что вы можете знать только во время выполнения, если произойдет обмен; но атомный обмен не должен быть изменчивым, потому что цель всегда обновляется (даже если это значение не изменяется), поэтому у компилятора нет неопределенности.
Я также вижу, что функция InterlockedIncrement() нестабильна, но instrincs нет. Внутренние возможности для CAS нестабильны для их назначения.
Thankyou очень много! теперь нужно исправить некоторый код ... :-) –
Должен сказать, что я озадачен. Почему для обмена требуется летучая цель? результат операции всегда предсказуем. –
@BlankXavier: IIRC ему требуется летучая мишень, чтобы он мог обеспечить барьер уровня уровня компилятора, в то время как фактическая команда prefixed 'LOCK' обеспечивает уровень защиты памяти уровня процессора. – Necrolis