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

9

我刚学习了interlocked类,它被认为比简单锁定更快。这很好,但我对实现感到好奇。

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

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

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

我进行了一些测试,事实上,使用Interlocked比简单锁定对象并增加它的速度快两倍。

他们是如何做到的?


@ArsenZahray,CPU 会为你的代码购买守卫和扫描器。它还会堆叠营地。 - J. Doe
1个回答

11

@ArsenZahray 你是怎么进行基准测试的?如果你是在调试模式下或者在VS测试主机下进行测试,那么你的基准测试结果会受到很大的偏差。 - Reed Copsey
我将每个操作运行了100000000次。并且我刚刚从cmd运行了我的程序,结果没有改变(lock: 00:00:02.4291389,interlocked: 00:00:01.1740671; ++:00:00:01.4320819)。 - Arsen Zahray
@ArsenZahray 我的经验是它比++慢一点,但我只进行了实际工作的基准测试 - 你可能会遇到一些JIT优化,这取决于你使用的操作等。 - Reed Copsey
1
@J.Doe Interlocked不支持太大以至于CPU无法原子移动的值。 - Reed Copsey
2
@J.Doe 请在此处查看可用的API:https://msdn.microsoft.com/zh-cn/library/system.threading.interlocked_methods(v=vs.110).aspx 还要阅读注释,其中提到:“仅当System.IntPtr为64位长时,Read方法和Increment、Decrement和Add方法的64位重载才真正是原子性的。” - Reed Copsey
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接