在c#中,Interlocked类中是否存在锁或队列

本文关键字:存在 是否 队列 Interlocked | 更新日期: 2023-09-27 18:15:30

联锁增量

Increments a specified variable and stores the result, as an atomic operation.

因此,这意味着当多个线程同时调用它时,结果也是正确的。

但我很好奇它是如何实现这一点的。当两个线程同时调用它时,它们之间有顺序吗?比如一个线程首先调用它,另一个线程第二次调用它。就像一个队列。

我的观点正确吗?

在c#中,Interlocked类中是否存在锁或队列

抖动对这样的方法有特定的认识。必要的,因为它们的实现是高度特定于处理器的。

对于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也有多个实现,你猜到了,这些实现在未来的任何时候都可能发生变化。