什么是Interlocked.Increment实际上在做什么?
Interlocked.Increment
似乎是在multithreading代码中需要执行的最标准/最简单的操作之一。
我假设该方法的function是一种排序模式,任何具有线程经验的人都能够复制。
所以基本上我想知道的是,如果有人可以提供Interlocked.Increment
方法实际内部执行的完全重复(解释它是如何工作的)? (我已经找到了实际方法的来源但却无法找到它)
根据阿尔巴哈里先生的说法,它做了两件事:
- 使OS和VM知道操作的primefaces性,因此例如32位系统上64位值的操作将是primefaces的
- 生成
full fence
限制互锁变量的重新排序和缓存
看看那个链接 – 它提供了一些很好的例子。
我假设它是一个实现细节,但是查看它的一种方法是检查JIT编译的代码。 请考虑以下示例。
private static int Value = 42; public static void Foo() { Interlocked.Increment(ref Value); }
在x86上,它生成以下内容
lock inc dword
锁定修饰符锁定总线以防止多个CPU更新相同的数据位置。
在x64上它生成
lock xadd dword ptr ,eax
我希望它是InterlockedIncrement64 Win32 API调用的包装器。
编辑:我看到这是一个非常短的回应。 构建一点:很容易复制函数的function,但不是性能。 大多数CPU中都有本机指令为您提供primefaces“互锁交换和添加”指令,因此您希望该指令用于实现您的function,我希望从C#中实现这一目的的最简单方法是进行win32 API调用。 有关该主题的更多背景信息,请查看此白皮书 。
- .NET2中的Action委托 – 使用generics类型’System.Action ‘需要’1’类型参数
- 检查数字数组是否是连续的function方法
- 何时使用JsonResult而不是ActionResult
- 如何从Process.Start打开到同一浏览器窗口或选项卡的链接?
- 保护模式为ON时,DeleteURLCacheEntry不会删除Internet临时文件
- C#反序列化已移动或已重命名的类
- Repeater在PostBacks上丢失了它的数据
- 如何使用RegEx Asp.net C#抓取BODY html标签内的所有内容(来自字符串)
- 可以在不创建派生类的情况下将数据传递给EventArgs吗?