Я читал из многих источников, что ключевое слово volatile
не помогает в многопоточных сценариях. Однако это утверждение постоянно оспаривается атомными функциями работы, которые принимают указатели volatile
.
Например, в Mac OS X мы имеем семейство функций OSAtomic
:
SInt32 OSIncrementAtomic(volatile SInt32 *address);
SInt32 OSDrecrementAtomic(volatile SInt32 *address);
SInt32 OSAddAtomic(SInt32 amount, volatile SInt32 *address);
// ...
И похоже, что аналогичное использование ключевого слова volatile
в Windows для операций Interlocked
:
LONG __cdecl InterlockedIncrement(__inout LONG volatile *Addend);
LONG __cdecl InterlockedDecrement(__inout LONG volatile *Addend);
Также кажется, что в С++ 11 атомные типы имеют методы с модификатором volatile
, что должно как-то означать, что ключевое слово volatile
имеет какую-то связь с атомарностью.
Итак, что мне не хватает? Почему производители ОС и разработчики стандартных библиотек настаивают на использовании ключевого слова volatile
для целей потоковой передачи, если это не полезно?