回答
jcopenha是正确的,但我只是想回答“是否只关注多处理器系统?”
我不知道你在用哪个Interlocked
。如果你的意思是C++,那么在单核上,如果x不大于“bitness”,你应该“安全地”做“++ x”。我编写的“应该是”,因为编译器可以在函数中以某种奇怪的方式对其进行优化 - 例如在完全不同的地方将两个“++ x”更改为普通的“add ...,2”,并且一些多线程逻辑可能因此而失败。在多核上,甚至在32位x上的++ x可能会有奇怪的效果(指令可以是“inc mem”或“lock inc mem”,并且当您未锁定时从两个cpus增加一个mem地址时,得到奇怪的结果)。
如果你的x的“bitness”高于你的cpu,那么你需要在任何多线程代码中互锁 - 无论它是单核还是多核都无关紧要,因为该指令必须编译成两个asm代码并且上下文切换可能发生在两者之间。 (这可以通过RCU修复)
在.NET中它基本上是一样的故事,但是你已经重载Increment,而不是Interlocked ...和Interlocked ... 64。
所以是的 - 只要你写多线程的东西(即使在单核上),只需在共享内存上使用互锁增量。这里不值得比机器更“聪明”。
我得到岸上的“应该做的”部分,因为你永远不知道它是否会在多核系统上运行。 另外,根据x的位置以及cpu的功能,x ++将解析为不同的机器代码。我正在考虑增加寄存器的情况,但这只是编译器可以实现的一种可能的方式。它可能最终成为读取内存,增量,写入内存。这肯定不是原子的。 试着将这回转换回嵌入式8位AVR和ARM世界,我习惯了。 – JeffV 2009-09-20 16:06:02
InterlockedIncrement通过使用机器级指令以原子方式增加和存储一个值。意味着在此过程中不能对数值和存储位置执行操作。
任何时候多个线程或进程或访问相同的值都值得关注。因此,多线程应用程序中的共享变量或多个进程的共享内存。
我不相信该指令禁止中断,至少在x86类型的硬件上。
- 1. ASP.NET 2.0 InterlockedIncrement错误
- 2. 相当于winapi的Qt InterlockedIncrement?
- 3. 唯一ID与:: InterlockedIncrement(VC++)
- 4. 的InterlockedIncrement':标识符在Visual C未找到错误++ 2008
- 5. 如何实现没有内存障碍的InterlockedIncrement
- 6. 针对32/64位的架构通用InterlockedIncrement
- 7. 声明为volatile的InterlockedIncrement参数有什么影响
- 8. 如何从堆中为InterlockedIncrement函数分配正确的内存对齐方式?
- 9. vs vs 2008 vs vs 2010
- 10. Exec的VS ExecWait VS ExecShell VS nsExec :: Exec的VS nsExec :: ExecToLog VS nsExec :: ExecToStack VS ExecDos VS ExeCmd
- 11. FTP vs SFTP vs HDFS vs NTFS vs EXT2,EXT3
- 12. VS VS VS VS 11中的MVC测试
- 13. CGL vs AGL vs OpenGL vs NSOpenGL vs CoreAnimation(CALayer)
- 14. MobileNet VS SqueezeNet VS ResNet50 VS启V3 VS VGG16
- 15. NTOSKRNL.EXE VS NTKRNLMP.EXE VS NTKRNLPA.EXE VS NTKRPAMP.EXE
- 16. VS 2008 vs VS 2008 Express
- 17. RailwayJS vs Geddy vs Express vs Socket.IO
- 18. .NET vs ASP.NET vs CLR vs ASP
- 19. DynamicProperty vs MutableProperty vs AnyProperty vs ConstantsProperty
- 20. codendi vs redmine vs Retrospectiva vs trac
- 21. body.scrollTop VS documentElement.scrollTop VS window.pagYOffset VS window.scrollY
- 22. Asp.net vs Html5 vs xml vs xhtml
- 23. Sleep VS alarmManager.set VS alarmManager.setRepeat VS Handler
- 24. Atomikos vs JOTM vs Bitronix vs?
- 25. inline vs __inline vs __inline__ vs __forceinline?
- 26. JRuby:import vs include vs java_import vs include_class
- 27. VS 2013 MSTest vs nUnit vs xUnit
- 28. SDI vs MDI vs TDI vs?
- 29. `Math.trunc` vs`| 0` vs`<<0` vs `>> 0` vs`&-1` vs`^ 0`
- 30. Stackpanel:高度vs ActualHeight vs ExtentHeight vs ViewportHeight vs DesiredSize vs RenderSize
你在说.NET或其他语言/平台吗? – 2009-09-19 14:03:35
@MatthewScharley我想他不是。他会提到互锁类(Interlocked *函数的托管包装),而不是InterlockedIncrement。 – mg30rg 2015-06-03 11:40:30