Я читал из многих источников, что 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);
Также кажется, что в C ++ 11 атомарные типы имеют методы с модификатор volatile
, который каким-то образом должен означать, что ключевое слово volatile
имеет какую-то связь с атомарностью.
Итак, что я упустил? Почему поставщики ОС и разработчики стандартных библиотек настаивают на использовании ключевого слова volatile
для потоковой передачи, если оно бесполезно?