разница между Interlocked.Exchange и Volatile.Write?
В чем разница между Interlocked.Exchange и Volatile.Write?
Оба метода обновляют значение некоторой переменной. Может кто-нибудь подвести итог, когда использовать каждый из них?
http://msdn.microsoft.com/ru-ru/library/bb337971 а такжеhttp://msdn.microsoft.com/en-us/library/gg712713.aspx
В частности, мне нужно обновить двойной элемент моего массива, и я хочу, чтобы другой поток видел самое новое значение. Что является предпочтительным?Interlocked.Exchange(ref arr[3], myValue)
или жеVolatile.Write(ref arr[3], info);
гдеarr
объявлен как?double
================================================== ========================== Реальный пример, я объявляю двойной массив следующим образом:
private double[] _cachedProduct;
В одной теме я обновляю это так:
_cachedProduct[instrumentId] = calcValue;
...
are.Set();
В другой теме я читаю этот массив так:
while(true) {
are.WaitOne();
...
result += _cachedProduct[instrumentId];
...
}
Для меня это просто отлично работает, как есть. Однако, чтобы убедитьсяэто всегда будет работать независимо от того, что кажется, я должен добавить либоVolatile.Write
или жеInterlocked.Exchange
, Поскольку двойное обновление не гарантируется как атомарноеhttp://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx
В ответе на этот вопрос я хочу увидеть подробное сравнение классов Volatile и Interlocked. Зачем нам 2 класса? Какой и когда использовать?