Interlocked.Increment
似乎是在多线程代码中最常见/简单的操作之一。
我认为该方法的功能是某种模式,任何有线程经验的人都能够复制。
所以基本上我想知道的是,是否有人能够提供一个精确的副本(并解释它的工作原理)来模拟 Interlocked.Increment
方法实际上是在内部执行什么操作? (我已经寻找了实际方法的源代码,但未能找到)
Interlocked.Increment
似乎是在多线程代码中最常见/简单的操作之一。
我认为该方法的功能是某种模式,任何有线程经验的人都能够复制。
所以基本上我想知道的是,是否有人能够提供一个精确的副本(并解释它的工作原理)来模拟 Interlocked.Increment
方法实际上是在内部执行什么操作? (我已经寻找了实际方法的源代码,但未能找到)
根据Albahari先生的说法,它有两个作用:
full fence
,限制对Interlocked变量的重新排序和缓存请参考链接中的一些示例。
我认为这是一个实现细节,但可以通过检查JIT编译的代码来看待它。考虑以下示例。
private static int Value = 42;
public static void Foo() {
Interlocked.Increment(ref Value);
}
lock inc dword <LOCATION>
lock修饰符锁定总线,以防止多个CPU更新相同的数据位置。
在x64上生成的代码为:
lock xadd dword ptr <LOCATION>,eax
我会期望它是一个对InterlockedIncrement64 Win32 API调用的封装。
编辑:我看到这是一个非常简短的回答。稍微扩展一下:复制函数的功能很容易,但无法复制其性能。大多数CPU都有本地指令,可以为您提供原子“交换和添加”指令,因此您希望使用该指令来实现您的函数,并且我预计从C#内部实现该操作的最简单方法是进行win32 API调用。有关此主题的更多背景,请查看this whitepaper。