У меня есть зубчатый массив double[][]
, который может одновременно изменяться несколькими потоками. Я хотел бы сделать его потокобезопасным, но, если возможно, без блокировок. Потоки вполне могут нацеливаться на один и тот же элемент в массиве, поэтому и возникает вся проблема. Я нашел код для атомарного увеличения двойных значений с использованием метода Interlocked.CompareExchange
: Почему нет перегрузки Interlocked.Add, которая принимает Doubles в качестве параметров?
Мой вопрос: останется ли он атомарным, если в Interlocked.CompareExchange
есть ссылка на зубчатый массив? Ваши идеи очень ценятся.
На примере:
public class Example
{
double[][] items;
public void AddToItem(int i, int j, double addendum)
{
double newCurrentValue = items[i][j];
double currentValue;
double newValue;
SpinWait spin = new SpinWait();
while (true) {
currentValue = newCurrentValue;
newValue = currentValue + addendum;
// This is the step of which I am uncertain:
newCurrentValue = Interlocked.CompareExchange(ref items[i][j], newValue, currentValue);
if (newCurrentValue == currentValue) break;
spin.SpinOnce();
}
}
}
newCurrentValue
вoldValue
- это просто сбивает с толку :) - person Marc Gravell   schedule 31.01.2017lock.Enter(ref locked); items[i][j] += addendum; lock.Exit();
- person Gusman   schedule 31.01.2017SpinLock
, спасибо. Пожалуйста, потерпите меня, я простой физик :) - person tethered.sun   schedule 31.01.2017