2012-12-04 59 views
3

我有一個「唯一」類型的整數。我這樣使用它:在這種情況下,鎖是否需要一個整數?

int unique=0; 
public int GetUniqueId() 
{ 
    return unique++; 
} 

我知道我有點偏執,但這是一個原子操作,還是它需要某種形式的鎖?這個函數將被用在一個非常併發的類中。

回答

9

否;這是重點不是原子。
x++編譯成三個單獨的指令(加載,增量,存儲),可以被其他線程中斷。

如果這將在多個線程上運行,您應該調用Interlocked.Increment(ref unique)(這是原子)。
這個調用比常規增量稍慢,比完全鎖定要快得多。

+0

這就是這樣的事情,使編寫併發代碼非常可怕:) – Earlz

+0

我以爲x86指令集的公司是原子,如果內存對齊? –

+0

@ ta.speot.is這可能是真的,但我知道現在在IL中沒有原子的「inc」指令......所以,它可能在某些JIT編譯器的x86下是原子的,但不能保證是所以.. – Earlz

0

如果此方法由併發線程使用,那麼您必須處理通過放置鎖實現的併發性。

相關問題