Interlocked.Increment
似乎是需要在多线程代码中执行的最标准/最简单的操作之一。
我假设该方法的功能是任何具有线程经验的人都可以复制的某种模式。
所以基本上我想知道的是,是否有人可以提供该Interlocked.Increment
方法在内部实际执行的操作的精确副本(并解释其工作原理)?(我已经寻找实际方法的来源但找不到它)
Interlocked.Increment
似乎是需要在多线程代码中执行的最标准/最简单的操作之一。
我假设该方法的功能是任何具有线程经验的人都可以复制的某种模式。
所以基本上我想知道的是,是否有人可以提供该Interlocked.Increment
方法在内部实际执行的操作的精确副本(并解释其工作原理)?(我已经寻找实际方法的来源但找不到它)
根据阿尔巴哈里先生的说法,它做了两件事:
full fence
互锁变量的限制性重新排序和缓存看看那个链接——它给出了一些很好的例子。
我认为这是一个实现细节,但查看它的一种方法是检查 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
我希望它是InterlockedIncrement64 Win32 API 调用的包装器。
编辑:我看到这是一个非常简短的回应。建立一点点:很容易复制函数的功能,但不是性能。大多数 CPU 中有本机指令为您提供原子“互锁交换和添加”指令,因此您希望该指令用于实现您的功能,我希望从 C# 中实现该指令的最简单方法是进行 win32 API 调用。有关该主题的更多背景信息,请查看此白皮书。