21

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

我假设该方法的功能是任何具有线程经验的人都可以复制的某种模式。

所以基本上我想知道的是,是否有人可以提供该Interlocked.Increment方法在内部实际执行的操作的精确副本(并解释其工作原理)?(我已经寻找实际方法的来源但找不到它)

4

3 回答 3

14

根据阿尔巴哈里先生的说法,它做了两件事:

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

看看那个链接——它给出了一些很好的例子。

于 2011-04-18T08:20:51.353 回答
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
于 2011-04-18T08:35:16.993 回答
1

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


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

于 2011-04-18T08:12:30.870 回答