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