InterlockedIncrement vs. ++

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

要回复问题请先登录注册