在c#中,Interlocked类中是否存在锁或队列
本文关键字:存在 是否 队列 Interlocked | 更新日期: 2023-09-27 18:15:30
联锁增量
Increments a specified variable and stores the result, as an atomic operation.
因此,这意味着当多个线程同时调用它时,结果也是正确的。
但我很好奇它是如何实现这一点的。当两个线程同时调用它时,它们之间有顺序吗?比如一个线程首先调用它,另一个线程第二次调用它。就像一个队列。
我的观点正确吗?
抖动对这样的方法有特定的认识。必要的,因为它们的实现是高度特定于处理器的。
对于x86和x64抖动,它将用LOCK XADD
机器代码指令代替方法调用。英特尔处理器上可用于原子递增变量的特定指令。一个角落案例是在long类型的变量上使用它,在32位模式下,抖动会在CLR内生成对助手方法的调用,以完成任务。命名为COMInterlocked::ExchangeAdd64()
。它又使用汇编代码来使用x86处理器上可用的LOCK CMPXCHG8B
机器代码指令。它将是ARM或安腾处理器上的其他东西,我没有现成的可以检查的。
通过使用Debug+Windows+反汇编调试器窗口查看生成的计算机代码,您可以自己发现这些详细信息。
Interlocked.Increment
在内部所做的是一个实现细节。不同的实现方式(.Net 2与.Net 4.5与Mono2等(可能实现完全不同。
例如,MS.Net实现(在Windows上(将使用InterlockedExchangeAdd
调用IIRC,但这是一个实现细节,可能会更改。
InterlockedExchangeAdd
的实现方式是Windows内核的一个细节,可能因版本而异,也可能因平台而异,或者两者兼而有之。例如,Raymond Chen描述了Windows可能以某种形式使用的一些可能的实现(是的,复数:实现(。它通常是某种形式的LS/SC和/或CAS(为了更好地衡量,添加一些内存屏障(,这些被认为是无锁定的,可能取决于实际CPU的实现细节。
例如,mono可能使用pthread_mutex
或Windows Interlocked*
API或内存栏等,具体取决于您为其构建mono的操作系统和平台。这是一个你不应该依赖的实现细节。未来的单声道版本可能会使用其他东西。再说一遍,即使是pthread_mutex
也有多个实现,你猜到了,这些实现在未来的任何时候都可能发生变化。