różnica między Interlocked.Exchange a Volatile.Write?
Jaka jest różnica między Interlocked.Exchange a Volatile.Write?
Obie metody aktualizują wartość jakiejś zmiennej. Czy ktoś może podsumować, kiedy używać każdego z nich?
http://msdn.microsoft.com/ru-ru/library/bb337971 ihttp://msdn.microsoft.com/en-us/library/gg712713.aspx
W szczególności muszę zaktualizować podwójny element mojej tablicy i chcę, aby inny wątek zobaczył najświeższą wartość. Co jest preferowane?Interlocked.Exchange(ref arr[3], myValue)
lubVolatile.Write(ref arr[3], info);
gdziearr
jest zadeklarowany jakodouble
?
================================================== ========================== Prawdziwy przykład, deklaruję taką podwójną tablicę:
private double[] _cachedProduct;
W jednym wątku aktualizuję to tak:
_cachedProduct[instrumentId] = calcValue;
...
are.Set();
W innym wątku przeczytałem następującą tablicę:
while(true) {
are.WaitOne();
...
result += _cachedProduct[instrumentId];
...
}
Dla mnie to po prostu działa dobrze. Jednak aby upewnić się, że „zawsze będzie działać”, niezależnie od tego, co się wydarzy, powinienem dodać takżeVolatile.Write
lubInterlocked.Exchange
. Ponieważ podwójna aktualizacja nie jest gwarantowana jako atomowahttp://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx
W odpowiedzi na to pytanie chcę zobaczyć szczegółowe porównanie klas Volatile i Interlocked. Dlaczego potrzebujemy 2 klas? Który i kiedy używać?