c# - Interlocked 是如何工作的,为什么它比 lock 更快?

标签 c# multithreading locking interlocked

<分区>

我刚刚了解到互锁类,它应该比简单的锁定更快。现在,这一切都很好,但我对实现感到好奇。

据我所知,确保对变量的操作以原子方式完成的唯一方法是确保在任何时刻只有一个线程可以访问该变量。这是锁定。

我已经使用反射器来获取 Interlocked 的源代码,但它似乎使用外部方法来完成所有工作:

[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
internal static extern int ExchangeAdd(ref int location1, int value);

我已经运行了一些测试,Interlocked 实际上比简单地锁定对象并递增它快两倍。

他们是怎么做到的?

最佳答案

Interlocked在CPU层面有支持,可以直接做原子操作。

例如,Interlocked.Increment实际上是一个 XADD ,并通过 Interlocked.CompareExchange 支持比较和交换(即:CMPXCHG instructions) (均带有 LOCK 前缀)。

关于c# - Interlocked 是如何工作的,为什么它比 lock 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18640327/

相关文章:

c# - 从 .Net Core 3.1 升级到 .Net 5 后序列化和 MD5 哈希失败

c# - 打印属性名称(不是你想的那样)

c# - .NET 多线程。即时更新 UI

java - 我在 Android 中执行线程的方式是否正确?

c# - 同时获取多个线程同步锁

c - 内核 read_lock 后跟 write_lock 提供软锁定

C# - 使用 Linq 选择 XML 后代

python - Pycassa,线程池, "Exception in thread Thread-3 (most likely raised during interpreter shutdown):"

java - Java 两个命令之间的延迟? - 游戏

linux - 在 Linux 上,如何确保解锁锁定在死亡/终止线程中的互斥量?