2013-10-09 38 views
3

我可以像我在當前的代碼中描述的那樣使用它嗎?我可以在鎖定語句中使用Interlocked.Increment嗎?

private void Increment() { 
    lock(LockObject) {  
     // edit 
     // ListOfObjects.Add(someInfo); 
     // new edit ---> here 
     ListOfObjects.Add(new SomeInfoObject() { 
      Account = Interlocked.Increment(ref result), 
      // ... other properties 
     } 
     // Interlocked.Increment(ref result); 
    } 
} 
+0

是的,你可以,但你不應該在這種情況下。你只會增加額外的開銷。但是,當它是一個鎖內的大部分代碼的一部分時,沒問題。 –

回答

3

當您使用Interlocked類時,不需要鎖定。

MSDN說,

遞增一個指定的變量,並將結果存儲,作爲一個原子操作

+3

這種類型取決於鎖塊內是否有其他東西,以及您鎖定的內容。例如,用Interlocker.Increment增加一些與鎖無關的東西是有意義的。 –

+0

是的,如果你在鎖構造中有更多的語句,那麼你可以做到這一點。從問題的角度來看,這不是必需的 –

3

是的,你可以,但應該沒有理由去做。 lockinterlocked只有在所有相關方都同意的情況下才能使用。如果一個線程使用lock,期望沒有任何東西可以更改,而另一個線程使用ICX,那麼ICX線程剛剛違反了第一個線程的假設。如果兩個線程同意使用lock,那麼在lock內使用ICX是有問題的。一個聲明lock,它所做的只是一個ICX是非常非常不尋常的。

您需要發佈更詳細的代碼說明,解釋您嘗試解決的實際問題。

1

可以使用它,但就是在這種情況下冗餘,因爲沒有別的正在被lock塊保護。

看看this post瞭解更多信息。

---編輯---

OK,我看你編輯的問題的東西添加到lock塊。

在這種情況下,這是有道理的,以保護該其它的操作,但是否也有道理把Interlocked.Incrementlock塊取決於你所要完成的任務。

你能提供更多的上下文嗎?

+0

你的意思是什麼? – IamStalker

+0

@IamStalker從本質上講,代碼的其他部分正在做什麼,以及您要完成的最終目標是什麼。 –

+0

只是爲了知道這個鎖定和原子操作在這種情況下使用? – IamStalker

相關問題