Qual è la differenza tra Interlocked.Exchange e Volatile.Write?differenza tra Interlocked.Exchange e Volatile.Write?
Entrambi i metodi aggiornano il valore di alcune variabili. Qualcuno può riassumere quando utilizzare ciascuno di essi?
http://msdn.microsoft.com/ru-ru/library/bb337971 e http://msdn.microsoft.com/en-us/library/gg712713.aspx
In particolare ho bisogno di aggiornare doppio punto della mia matrice, e voglio un altro thread per vedere il valore più fresco. Qual è il preferito? Interlocked.Exchange(ref arr[3], myValue)
o Volatile.Write(ref arr[3], info);
dove arr
è dichiarato come double
?
========================================= ============================== esempio reale, dichiaro doppio array del genere:
private double[] _cachedProduct;
In una filettatura I aggiorno così:
_cachedProduct[instrumentId] = calcValue;
...
are.Set();
In un'altra discussione ho letto questa matrice così:
while(true) {
are.WaitOne();
...
result += _cachedProduct[instrumentId];
...
}
Per me funziona perfettamente così com'è. Tuttavia, per assicurarsi che "funzionerà sempre", a prescindere da ciò che sembra, è necessario aggiungere Volatile.Write
o Interlocked.Exchange
. Perché il doppio aggiornamento non è garantito per essere atomico http://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx
Nella risposta a questa domanda voglio vedere un confronto dettagliato delle classi Volatile e Interlocked. Perché abbiamo bisogno di 2 lezioni? Quale e quando usare?
Non è possibile utilizzare Volatile.Write in questo caso specifico: accetta solo tipi di riferimento, non tipi di valore. –
Si sta utilizzando un handle di attesa, già * garantisce * che l'altro thread visualizzi completamente il valore più recente. * * Funzionerà sempre. – harold