Ответ 1
Поскольку переменная ref a
может измениться "снова" до того, как Interlocked
вернется (или даже после ее возврата и до использования a
). Вместо этого функция возвращает вычисляемое значение.
Пример:
int a = 5;
// on thread 1
int b = Interlocked.Add(ref a, 5); // b = 10
// on thread 2, at the same time
int c = Interlocked.Add(ref a, 5); // c = 15
// on thread 1
Thread.Sleep(1000); // so we are "sure" thread 2 executed
Thread.MemoryBarrier(); // just to be sure we are really reading a
bool x1 = (b == 10); // true
bool x2 = (a == 15); // true