2011-03-14 43 views
5

當一個線程新建一個不可變的對象,並在第二個線程中共享(比如共享對象的一個​​字段)時,不應該第二個線程同步?是否需要通過C#中的內存障礙訪問不可變對象?

Thread1: 
========= 
x = new SomeObject() 

Thread2 
========= 
if (x != null) 
x.DoSomething() 

x.DoSomething()之前是否應該有內存屏障?是否有可能在第一個線程中對x的賦值對第二個線程永遠不可見? .NET的安全發佈模式是什麼?

回答

2

是的,線程2可能永遠不會看到您寫入的代碼的x的非空值(取決於代碼的優化方式)。你不需要明確的記憶障礙。只需將x聲明爲volatile即可。

+0

好的。 .NET中是否有任何安全的出版物相關信息/文檔? – drr 2011-03-14 20:52:15

+1

我想這取決於你想要做什麼。我將以MSDN上的並行模式庫爲出發點。除此之外,你幾乎只有同步原語。你也可以看看Joe Duffy的網絡日誌。他談到了鎖定和並行數據訪問的更多細節。 – 2011-03-14 21:53:51

+0

我不知道有這樣說的任何文檔,但爲了安全起見,需要在寫入和讀取時使用內存隔離。你可以通過上述幾種方式獲得鎖,volatile,Thread.VolatileRead/Write,顯式調用MemoryBarrier。參見[線程在c#](http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility)瞭解更多信息 – BrandonAGr 2011-03-15 01:13:45