まず、InterlockedExchange64();があります。
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 );
次に、InterlockedExchange64()と同様にvolatileを使用するInterlockedExchangePointer()があります。
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()に到達し、ここでvolatileが使用されていることがわかります。
http://msdn.microsoft.com/en-us/library/853x471w.aspx
void * _InterlockedExchangePointer( void * volatile * Target, void * Value );
基本的な指示はすべての場合で同じですが、何が得られますか?ドキュメントエラー?
GCCの本能は、交換のための揮発性については言及していませんが、CASについても言及していません!だからそれは助けにはなりません。
私の見解では、CASターゲットは揮発性です。これは、実行時に交換が発生するかどうかしかわからないためです。ただし、ターゲットは常に更新されるため(値が変更されない場合でも)、アトミック交換は揮発性であってはなりません。したがって、コンパイラーには不確実性がありません。
InterlockedIncrement()の関数も揮発性ですが、instrincsは揮発性ではありません。CASの本質は、宛先に対して不安定です。