Если volatile бесполезен для многопоточности, почему атомарные операции требуют указателей на изменчивые данные?

Я читал из многих источников, что 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 для потоковой передачи, если оно бесполезно?

28
задан Community 23 May 2017 в 12:09
поделиться