InterlockedIncrement 是如何工作的?
是否只关注多处理器系统?
它有什么作用,禁用所有处理器的中断?
InterlockedIncrement 是如何工作的?
是否只关注多处理器系统?
它有什么作用,禁用所有处理器的中断?
InterlockedIncrement 通过使用机器级指令以原子方式递增和存储值来工作。意味着在此过程中不能对值和存储位置进行任何操作。
任何时候多个线程或进程或访问相同的值都是值得关注的。所以多线程应用程序中的共享变量,或多个进程的共享内存。
我不相信该指令会禁用中断,至少在 x86 类型的硬件上是这样。
jcopenha 是正确的,但我只是想回答“仅关注多处理器系统吗?”
不知道Interlocked
你用的是哪个。如果您的意思是c ++,那么在单核上,如果x 不大于您的“位数”,则“应该”安全地执行“++ x”。我写“应该是”,因为编译器可以在函数中以某种奇怪的方式对其进行优化 - 例如将两个“++x”更改为一个完全不同的地方的普通“add ...,2”以及一些多线程逻辑可能因此而失败。在多核上,即使是 32 位 x 上的 ++x 也会产生奇怪的效果(指令可以是“inc mem”或“lock inc mem”,当你从两个 CPU 中增加一个内存地址时,它没有被锁定,你得到奇怪的结果)。
如果你的 x 的“位数”高于你的 cpu,那么你需要在任何多线程代码中互锁——不管它是单核还是多核,因为该指令无论如何都必须编译成两个 asm 代码并且上下文切换可能发生在两者之间。(这可以通过 RCU 修复)
在 .NET 中,情况基本相同,但您重载了 Increment,而不是 Interlocked... 和 Interlocked...64。
所以是的 - 每当你编写多线程的东西(即使是在单核上),只需使用共享内存上的互锁增量。在这里尝试比机器“更聪明”是不值得的。
如果您关心性能,InterlockIncrement 绝对是要走的路:InterlockIncrement 递增指定变量并存储结果,因为传递变量的原子操作(MSDN)通过引用传递(Interlocked.Increment(ref increment))。使用 ++,值通过地址传递,导致每次调用指令时都会在内存中进行一次往返。