什么是联锁.增量实际在做什么
本文关键字:什么 | 更新日期: 2023-09-27 17:50:21
Interlocked.Increment
似乎是多线程代码中需要执行的最标准/最简单的操作之一。
我假设该方法的功能是任何有线程经验的人都能够复制的某种排序模式。
所以基本上我想知道的是,如果有人能提供一个确切的副本(解释它是如何工作的),Interlocked.Increment
方法实际上在内部做什么?(我已经寻找了实际方法的来源,但无法找到它)
根据Albahari先生的说法,它有两个作用:
- 使操作的原子性为操作系统和VM所知,因此,例如在32位系统上对64位值的操作将是原子性的
- 生成
full fence
,限制互锁变量的重排序和缓存
看一下这个链接——它给出了一些很好的例子。
我假设这是一个实现细节,但是查看它的一种方法是检查JIT编译的代码。考虑下面的示例:
private static int Value = 42;
public static void Foo() {
Interlocked.Increment(ref Value);
}
在x86上生成如下
lock inc dword <LOCATION>
锁修饰符锁定总线以防止多个cpu更新相同的数据位置。
在x64上生成
lock xadd dword ptr <LOCATION>,eax
我希望它是InterlockedIncrement64 Win32 API调用的包装器。
编辑:我看到这是一个非常短的回应。在此基础上构建一点:很容易复制函数的功能,但不能复制性能。在大多数cpu中都有提供原子"互锁交换和添加"指令的本地指令,因此您希望使用该指令来实现您的函数,我希望在c#中实现该功能的最简单方法是进行win32 API调用。有关该主题的更多背景信息,请查看本白皮书。