为什么Interlocked.Add()方法必须返回一个值?

时间:2015-03-04 09:12:09

标签: c# multithreading

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 个答案:

答案 0 :(得分:32)

因为变量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