diferença entre Interlocked.Exchange e Volatile.Write?
Qual é a diferença entre Interlocked.Exchange e Volatile.Write?
Ambos os métodos atualizam o valor de alguma variável. Alguém pode resumir quando usar cada um deles?
http://msdn.microsoft.com/ru-ru/library/bb337971 ehttp://msdn.microsoft.com/pt-br/library/gg712713.aspx
Em particular, preciso atualizar o item duplo do meu array e quero outro thread para ver o valor mais recente. O que é preferido?Interlocked.Exchange(ref arr[3], myValue)
ouVolatile.Write(ref arr[3], info);
Ondearr
é declarado comodouble
?
================================================== ========================== Exemplo real, eu declaro double array assim:
private double[] _cachedProduct;
Em um thread eu atualizo assim:
_cachedProduct[instrumentId] = calcValue;
...
are.Set();
Em outro segmento eu li essa matriz assim:
while(true) {
are.WaitOne();
...
result += _cachedProduct[instrumentId];
...
}
Para mim, funciona bem como está. No entanto, para ter certeza de que "sempre funcionará", não importa o que pareça, devo adicionarVolatile.Write
ouInterlocked.Exchange
. Porque a atualização dupla não é garantida para ser atômicahttp://msdn.microsoft.com/pt-br/library/aa691278%28VS.71%29.aspx
Na resposta a essa pergunta, quero ver uma comparação detalhada das classes Volátil e Intertravada. Por que precisamos de duas classes? Qual e quando usar?