2012-12-05 34 views
2

我繼承的是有一組被捕獲過上一個單獨的線程運行的串行鏈路的實時值的一些代碼:如何同步值的C#集合

class Data 
{ 
    public static int nFooCount; 
    public static decimal meanValue; 
    // Lots more of a variety of types. 
} 

線程只是將數據存儲到字段中,無需鎖定或其他同步。看起來像是一個充滿競爭的海洋。所以我想給它增加一些安全性。問題是,什麼是最好的?

我可以使int字段變成易失性的。儘管如此,不能用小數類型。聯鎖可以幫助這一點,儘管混亂,使用拳擊。或者我可以添加鎖對象

private static readonly object lockObj = new object(); 

然後訪問器應有盡有。但是這會鎖定所有的字段,即使它只能一次修改一個字段。無論如何,我無法鎖定基元,這將是一個糟糕的形式,並且爲每個字段添加一個鎖定對象看起來很浪費。那麼有沒有更好的方法?

+0

你寫「在一個單獨的線程」。這是單數。對我來說,聽起來好像只有一個線程正在寫入這些值。如果確實如此,那裏沒有競爭條件,因此不需要鎖定。 –

+0

@DanielHilgarth如果編寫器線程具有非原子寫入,讀取器線程可能會讀取無效數據。 – phoog

+0

Daniel - 如果主線程被搶佔並嘗試讀取,而IO線程只有一半寫入字段,會發生什麼? –

回答

3

您可以使用ReaderWriterLockSlim根據所需的訪問級別進行鎖定。您可以通過將其變成一個屬性做得更好:

public int Something 
{ 
    get { 
     locker.EnterReadLock(); 

     try { 
     return something; 
     } finally { 
     locker.ExitReadLock(); 
     } 
    } 
    set { 
     locker.EnterWriteLock(); 

     try { 
     something = value; 
     } finally { 
     locker.ExitWriteLock(); 
     } 
    } 
} 

這允許多次讀取和單寫。

+0

這並不壞。我爲班級中的所有字段使用單個儲物櫃,而不是類中的更衣室PER字段,是的? –

+0

是所有領域的單個儲物櫃通常。 – Lloyd