Interlocked 是如何工作的,为啥它比 lock 更快? [复制]
Posted
技术标签:
【中文标题】Interlocked 是如何工作的,为啥它比 lock 更快? [复制]【英文标题】:How does Interlocked work and why is it faster than lock? [duplicate]Interlocked 是如何工作的,为什么它比 lock 更快? [复制] 【发布时间】:2013-09-05 15:27:01 【问题描述】:我刚刚了解到互锁类,它应该比简单的锁定更快。现在,这一切都很好,但我对实施感到好奇。
据我所知,确保对变量的操作以原子方式完成的唯一方法是确保在任何时候只有一个线程可以访问该变量。哪个是锁定的。
我使用反射器来获取Interlocked的来源,但它似乎使用外部方法完成所有工作:
[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
internal static extern int ExchangeAdd(ref int location1, int value);
我已经运行了一些测试,实际上 Interlocked 的速度是简单地锁定对象并增加它的两倍。
他们做得怎么样?
【问题讨论】:
@ArsenZahray,CPU 为您的代码购买了病房和灰尘。它还堆叠营地。 【参考方案1】:Interlocked在CPU层面有支持,可以直接做原子操作。
例如,Interlocked.Increment
实际上是一个XADD
,并且通过CMPXCHG
instructions(都带有LOCK
前缀)支持比较和交换(即:Interlocked.CompareExchange
)。
【讨论】:
有趣的是 - 我只是运行了一个测试 Interlocked vs ++。联锁似乎更快 @ArsenZahray 你的基准测试如何?如果您在调试中或在 VS 测试主机下执行此操作,您的基准测试将高度偏斜。 我运行每个操作 100000000 次。我只是从cmd运行我的程序,结果没有改变(锁定:00:00:02.4291389,互锁:00:00:01.1740671;++:00:00:01.4320819 @J.Doe Interlocked 不支持 CPU 无法自动移动的太大值。 @J.Doe 在此处检查可用的 API:msdn.microsoft.com/en-us/library/… 还请阅读注释,其中提到:“Read 方法和 Increment、Decrement 和 Add 方法的 64 位重载是只有在 System.IntPtr 为 64 位长的系统上才是真正的原子。"以上是关于Interlocked 是如何工作的,为啥它比 lock 更快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如果 Interlocked.Increment 是原子的,为啥我应该使用 ++ 代替?
引用分配是原子的,那么为啥需要 Interlocked.Exchange(ref Object, Object)?
为啥 Interlocked.CompareExchange<T> 只支持引用类型?
当 Interlocked 类可用时,为啥在 .NET 中使用 SyncLocks 进行简单操作?