2012-08-28 40 views
2

我想我讀了Int32和Int64上的操作在64位系統上(即,程序集/應用程序編譯爲64位)是真正原子的。淨。64位.net上的Int32/Int64操作的線程安全性

這是真的嗎?

我無法找到MSDN引用,所以我想我會問你們這裏。

我想知道是否使用Interlocked類從多個線程檢查和遞減Int32的值,並且我將它編譯爲64位應用程序。

在MSDN上的這些方法的文檔中有一點幫助,但我不確定是否正確理解它。

由於

+0

你所說的 「使用互鎖類」 是什麼意思? –

+0

它意味着使用System.Threading.Interlocked類來遞減Int32的值。 – grizzly

回答

4

再遞增值:

手動增量是從未保證是原子 - 未在x86,未在x64;它是四個操作:加載,加載,添加,存儲。 JIT可能會發現一個負載常量-1(ldc_i4_1/ldc_i8)並使其更簡單一點,但從根本上說:這不是一個單一的原子操作。您不能多線程代碼中執行線程安全增量(這不冒險丟失的更新),而不使用某種鎖定結構,或使用Interlocked

重新分配原子(又名撕裂值):上int(等)

操作保證是由語言規範原子; long(etc)的操作不能保證爲。是的,它很可能是在x64上是原子,但是這裏是一個問題:當擔心原子性時,你必須處理線程。當線程處理,您不看的實施,即什麼發生是 - 因爲這是不能保證,你可能關心這個代碼做什麼打算。作爲這樣的國際海事組織,你必須只關心什麼保證,這意味着:你不能依靠long(等)是原子。

相反,使用Interlocked.IncrementInterlocked.Add

+0

哇,謝謝你的回答。我在MSIL代碼中檢查過,你是對的:(int)i ++使用了四個步驟:ldloc.0,ldc.i4.1,add,stloc.0。這些答案就是讓你明白你在做什麼。 – grizzly

+1

@在某些方面,你可能認爲自己可能是一個「通過這個i4/i8引用逐步增加」的理由,並不合理......這可能是JIT在幕後做到的。 –

相關問題