什么是Interlocked.Increment实际上在做什么?

时间:2011-04-18 08:06:20

标签: c# multithreading interlocked

Interlocked.Increment似乎是在多线程代码中需要执行的最标准/最简单的操作之一。

我认为该方法的功能是一种排序模式,任何具有线程经验的人都能够复制。

所以基本上我想知道的是,如果有人能够提供Interlocked.Increment方法实际内部执行的完全重复(以及它是如何工作的解释)? (我已经找到了实际方法的来源但却无法找到它)

3 个答案:

答案 0 :(得分:13)

根据Albahari先生的说法,它做了两件事:

  • 使OS和VM知道操作的原子性,例如, 32位系统上64位值的操作将是原子的
  • 生成full fence限制互锁变量的重新排序和缓存

看看那个链接 - 它提供了一些很好的例子。

答案 1 :(得分:9)

我认为它是一个实现细节,但是查看它的一种方法是检查JIT编译的代码。请考虑以下示例。

private static int Value = 42;
public static void Foo() {
   Interlocked.Increment(ref Value);
}

在x86上,它会生成以下内容

lock inc dword <LOCATION>

lock修饰符锁定总线以防止多个CPU更新相同的数据位置。

在x64上生成

lock xadd dword ptr <LOCATION>,eax

答案 2 :(得分:1)

我希望它是InterlockedIncrement64 Win32 API调用的包装器。


编辑:我看到这是一个非常短的回应。构建一点:很容易复制函数的功能,但不是性能。大多数CPU中都有本机指令为您提供原子“互锁交换和添加”指令,因此您希望使用该指令来实现您的功能,并且我希望在C#中实现该指令的最简单方法是进行win32 API调用。有关该主题的更多背景知识,请查看this whitepaper