Протестировать и условно обновить долго используя Interlocked - PullRequest
2 голосов
/ 08 июля 2011

Есть ли удобный способ сделать это с помощью класса Interlocked?Или я должен просто использовать lock { }?

Мой конкретный вариант использования состоит в том, что у меня есть несколько потоков, которые вычисляют значение long и сравнивают его с общим «максимальным» значением, заменяя общее значение только в том случае, еслиместное значение больше.

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Попробуйте метод Interlocked.CompareExchange. Я не пробовал, но что-то подобное мне кажется логичным :

long localMax = Interlocked.Read(ref max);
while (value > localMax) {
  Interlocked.CompareExchange(ref max, value, localMax);
  localMax = Interlocked.Read(ref max);
}

Как обычно, проведите стресс-тестирование кода, чтобы попытаться выявить проблемы параллелизма.

0 голосов
/ 08 июля 2011

До тех пор, пока значение вашего общего поля только увеличивается, вы можете сделать что-то подобное с комбинацией Read и CompareExchange.

long sharedVal = Interlocked.Read(ref _sharedField);
while (localVal > sharedVal)
{
    long temp = Interlocked.CompareExchange(ref _sharedField, localVal, sharedVal);
    sharedVal = (temp == sharedVal) ? localVal : temp;
}

Однако в этой ситуации я бы выбрал простой lock: использование Interlocked, как этот, менее читабельно, чем блок lock, и также может привести к гораздо более низкой производительности.

...