Почему метод Interlocked.Add() должен возвращать значение?

public static int Add(ref int location1,int value)

Я пытался использовать метод Interlocked.Add(ref int location1, int value) для добавления к числу в атомном режиме в многопоточном сценарии. Но у меня возник вопрос: почему метод снова возвращает значение location1? Вместо этого мы могли бы напрямую использовать переменную, которая передается как "ref".

Ниже приведен псевдо-код:

int a = 6;
int b = 7;

// some thing else

Interlocked.Add(ref a, b);

// Use the variable 'a' here.

Ответы

Ответ 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