2009-09-19 58 views
1

InterlockedIncrement如何工作?InterlockedIncrement vs. ++

只有在多處理器系統上纔會關注嗎?

它是做什麼的,禁用所有處理器中的中斷?

+0

你在說.NET或其他語言/平臺嗎? – 2009-09-19 14:03:35

+0

@MatthewScharley我想他不是。他會提到互鎖類(Interlocked *函數的託管包裝),而不是InterlockedIncrement。 – mg30rg 2015-06-03 11:40:30

回答

2

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。

所以是的 - 只要你寫多線程的東西(即使在單核上),只需在共享內存上使用互鎖增量。這裏不值得比機器更「聰明」。

+0

我得到岸上的「應該做的」部分,因爲你永遠不知道它是否會在多核系統上運行。 另外,根據x的位置以及cpu的功能,x ++將解析爲不同的機器代碼。我正在考慮增加寄存器的情況,但這只是編譯器可以實現的一種可能的方式。它可能最終成爲讀取內存,增量,寫入內存。這肯定不是原子的。 試着將這回轉換回嵌入式8位AVR和ARM世界,我習慣了。 – JeffV 2009-09-20 16:06:02

4

InterlockedIncrement通過使用機器級指令以原子方式增加和存儲一個值。意味着在此過程中不能對數值和存儲位置執行操作。

任何時候多個線程或進程或訪問相同的值都值得關注。因此,多線程應用程序中的共享變量或多個進程的共享內存。

我不相信該指令禁止中斷,至少在x86類型的硬件上。

+1

相反,只要你的應用程序是多線程的,你所運行的系統並不重要,那麼你需要擔心。但是,在一個運行在多處理器系統上的單線程應用程序中,反過來並不是真的,但仍然不需要擔心。 – 2009-09-19 14:06:52

+0

在多進程上下文中稍微提到了多線程和共享內存。 – jcopenha 2009-09-19 14:11:29

+0

我認爲這個問題提到了多處理器系統(帶有多個獨立的處理器)。 AFAIK InterlockedIncrement()也適用於這種情況,但我不知道它是如何實現的(因爲鎖定指令僅在其中一個處理器上運行)。 – mg30rg 2015-06-03 11:43:10

相關問題