¿Cuál es la diferencia entre Interlocked.Exchange y Volatile.Write?diferencia entre Interlocked.Exchange y Volatile.Write?
Ambos métodos actualizan el valor de alguna variable. ¿Alguien puede resumir cuándo usar cada uno de ellos?
http://msdn.microsoft.com/ru-ru/library/bb337971 y http://msdn.microsoft.com/en-us/library/gg712713.aspx
En particular, es necesario que actualice el doble punto de mi matriz, y quiero otro hilo para ver el valor más actualizado. ¿Qué se prefiere? Interlocked.Exchange(ref arr[3], myValue)
o Volatile.Write(ref arr[3], info);
donde arr
se declara como double
?
============================================== ============================== ejemplo real, declaro doble matriz así:
private double[] _cachedProduct;
En una hILO actualizo de esa manera:
_cachedProduct[instrumentId] = calcValue;
...
are.Set();
En otro hilo leí esta matriz de esa manera:
while(true) {
are.WaitOne();
...
result += _cachedProduct[instrumentId];
...
}
Para mí solo funciona bien como está. Sin embargo, para asegurarse de que "siempre funcionará", no importa lo que parezca, debo agregar Volatile.Write
o Interlocked.Exchange
. Debido a que la actualización doble no está garantizada como atómica http://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx
En la respuesta a esta pregunta, quiero ver una comparación detallada de las clases Volátil e Interbloqueado. ¿Por qué necesitamos 2 clases? ¿Cuál y cuándo usar?
No puede usar Volatile.Write en este caso específico: solo acepta tipos de referencia, no tipos de valores. –
Está utilizando un identificador de espera, ya * garantiza * que el otro subproceso ve el valor más nuevo por completo. * Siempre * funcionará. – harold