c# - 在 C# 中,Interlocked 类中是否有锁或队列?

标签 c# multithreading concurrency

互锁.增量

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

也就是说,当多个线程同时调用时,结果也是对的。

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

我的看法对吗?

最佳答案

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

对于 x86 和 x64 抖动,它会将方法调用替换为 LOCK XADD 机器代码指令。 Intel 处理器上可用的特定指令,用于自动递增变量。极端情况是在 long 类型的变量上使用它,在 32 位模式下,抖动会生成对 CLR 内部辅助方法的调用以完成工作。命名为 COMInterlocked::ExchangeAdd64()。它又使用汇编代码来使用 x86 处理器上可用的 LOCK CMPXCHG8B 机器代码指令。在 ARM 或 Itanium 处理器上它会是另外一种东西,我没有现成的可供检查的东西。

您可以通过使用 Debug + Windows + Disassembly 调试器窗口查看生成的机器代码来自己发现这些细节。

关于c# - 在 C# 中,Interlocked 类中是否有锁或队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25016681/

相关文章:

java - Semaphore 的大小可以与Threads 的执行顺序相关吗?

c++ - 在使用 stop_token 等待条件变量_any 时是否需要拥有锁来请求停止?

c# - GridView :'Object' 不包含定义

c# - 覆盖字符串的方括号运算符?

java - Java线程数量随时间增长的原因

java - 使用 JPA 提高 foreach 持久调用的性能

c++ - 如果我们使用内存防护来增强一致性,那么 “thread-thrashing”会如何发生?

c++ - 避免线程本地存储开销(使 ffmpeg YADIF 可扩展)

c# - Xamarin/Mono 找不到 System.Core

c# - 绑定(bind)值更改时未设置 WPF DataTrigger