回答
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