2013-12-20 62 views
-1

我創建了一個示例程序below.In這個節目,我想到兩件事無鎖多個併發讀者

  1. 我不得不重寫ToString()方法,該方法應該支持併發讀取。
  2. 應該是線程安全的

using System.Collections.Generic; 
using System.Linq; 

namespace Second.App 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var sampleClass=new SampleClass(); 
      sampleClass.AddString("Apple"); 
      sampleClass.AddString("Orange"); 
      string allStr = sampleClass.ToString(); 
     } 
    } 
    public class SampleClass:SecondClass 
    { 
     public override void AddString(string text) 
     { 
      base.AddString(text); 
     } 
     public override string ToString() 
     { 
      return base.ToString(); 
     } 
    } 
    public class SecondClass 
    { 
     private readonly List<string> _collection = new List<string>(); 
     public virtual void AddString(string text) 
     { 
      _collection.Add(text); 
     } 

     public override string ToString() 
     { 
      const string delimiter = ","; 
      return _collection.Aggregate((i, j) => i + delimiter + j); 
     } 
    } 
} 

希望有好的答案..

+3

爲了得到很好的答案,你需要有一個很好的問題。這裏沒有問題! –

+0

'SampleClass'的目的是什麼?它只是覆蓋,但調用「SecondClass」? – StuartLC

+0

爲什麼「無鎖」?這個要求背後有很多誤解。只需使用常規鎖定或ReaderWriter版本即可。 –

回答

1

您可以通過緩存摺疊串優化單個作家和多個併發讀者的性能。併發讀者可以得到一個陳舊的字符串,但分配將是原子。如果您有多個作者,您將需要同步。

public class SecondClass 
{ 
    private readonly List<string> _collection = new List<string>(); 
    private string _lastFoldedString; 
    private const string delimiter = ","; 

    public virtual void AddString(string text) 
    { 
     // You'll need some synchronization type if more than one concurrent writer 
     // lock(_collection) 
     { 
      _collection.Add(text); 
      // Or Use String.Join, or just have a running appender 
      _lastFoldedString = _collection.Aggregate((i, j) => i + delimiter + j); 
     } 
    } 

    public override string ToString() 
    { 
     return _lastFoldedString; 
    } 
} 
0

有各種集合類有可以處理的併發訪問,例如在System.Collections.Concurrent命名空間中。

但他們都用鎖本身的工作。還有什麼其他方式可以處理併發訪問?

+0

「還有什麼其他方式可以處理併發訪問?」那麼,鎖不是神奇的。他們也需要實施。看看http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx。那麼不要使用它。 :-) –

+0

咦? 「互鎖」也固有地使用鎖。我不明白你的意見... –

+0

那麼,定義「鎖」。 C#'lock'語句是調用'Monitor'類的語法糖,它使用Interlocked類公開的相同處理器指令完成它的魔法。所以某種程度上,鎖使用互鎖操作,而不是相反。欲瞭解更多信息,http://www.albahari.com/threading/threading.pdf是一個很好的閱讀。 –

1

System.Threading.ReaderWriterLockSlim會做你的需要。

使用ReaderWriterLockSlim來保護多個線程讀取的資源,並且一次由一個線程寫入。 ReaderWriterLockSlim允許多個線程處於讀取模式, 允許一個線程處於寫入模式,並擁有 鎖的獨佔所有權,並允許一個具有讀取訪問權限的線程處於可升級的讀取模式,線程可以從該模式升級寫入模式不需要 必須放棄其對資源的讀取訪問權限。

我相當肯定,ReaderWriterLockSlim試圖避免OS級別互斥(lock使用這些)由紡短鎖和促進互斥更長的鎖。