В чем разница между 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
В ответе на этот вопрос я хочу увидеть подробное сравнение летучих и блокированных классов. Почему нам нужны 2 класса? Какой и когда использовать?