我刚学会了互锁类,它应该比简单锁定更快。现在,这一切都很好,但我对实施感到好奇。
据我所知,确保对变量进行操作的唯一方法是确保只有一个线程可以随时访问该变量。哪个是锁定的。
我使用了反射器来获取Interlocked的来源,但似乎它使用外部方法来完成所有工作:
[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
internal static extern int ExchangeAdd(ref int location1, int value);
我已经运行了一些测试,实际上Interlocked只是锁定对象并增加它的速度的两倍。
他们是怎么做到的?
答案 0 :(得分:9)
Interlocked支持CPU级别,可以直接进行原子操作。
例如,Interlocked.Increment
实际上是XADD
,并且通过Interlocked.CompareExchange
支持比较和交换(即:CMPXCHG
instructions)(均为LOCK
}前缀)。