Вот общий шаблон для имитации блокировки операции.
public static T InterlockedOperation<T>(ref T location, T value)
{
T initial, computed;
do
{
initial = location;
computed = op(initial, value); // initial | value
}
while (Interlocked.CompareExchange(ref location, computed, initial) != initial);
return computed;
}
Операция min - это совсем другая история. Проблема здесь в том, что в игре есть две области памяти. Кроме того, мы заинтересованы только в их чтении. Это означает, что нам действительно нужно беспокоиться только о проблеме с барьером памяти. Украсьте свои поля с помощью volatile
или сделайте явный вызов Thread.MemoryBarrier
, прежде чем вычислять мин.
Редактировать: Я пропустил тот факт, что результат операции min назначен на a
. Вы можете использовать шаблон, который я определил выше, но вместо computed = initial | value
do computed = initial < value ? initial : value
. Все остальное остается прежним.