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.
答案 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