He estado leyendo de muchas fuentes que the volatile
keywordis not helpfulin multithreaded scenarios. Sin embargo, esta afirmación se ve desafiada constantemente por las funciones de operación atómica que aceptan punteros volatile
.Si la volatilidad es inútil para enhebrar, ¿por qué las operaciones atómicas requieren punteros a los datos volátiles?
Por ejemplo, en Mac OS X, que tienen la familia OSAtomic
función:
SInt32 OSIncrementAtomic(volatile SInt32 *address);
SInt32 OSDrecrementAtomic(volatile SInt32 *address);
SInt32 OSAddAtomic(SInt32 amount, volatile SInt32 *address);
// ...
y parece que hay un uso similar de la volatile
palabra clave en Windows para Interlocked
operaciones:
LONG __cdecl InterlockedIncrement(__inout LONG volatile *Addend);
LONG __cdecl InterlockedDecrement(__inout LONG volatile *Addend);
También parece que en C++ 11, los tipos atómicos tienen métodos con el modificador volatile
, lo que de alguna manera debe significar que la palabra clave volatile
tiene algún tipo de relación con atomicit y
Entonces, ¿qué es lo que me falta? ¿Por qué los vendedores de SO y los diseñadores de bibliotecas estándar insisten en usar la palabra clave volatile
para enhebrar si no es útil?
No es tan volátil no tiene ningún uso, es más que datos volátiles no garantiza las operaciones atómicas –
No es una víctima, pero se superpone con http://stackoverflow.com/questions/2479067/why-is-the-volatile- qualifier-used-through-out-stdatomic –