2014-01-25 42 views
0

我是新約的反應,但想法把我的好奇心,所以我做了一些有點反應變量,但我不知道這是否是最好的初步實踐,然後我就會把這個線程。使屬性線程安全c#信號量或鎖?

這裏的類:

公共類RxVar:的IObservable {

T _value; 
    public T Value 
    { 

     get{ 
      return _value; 
     } 
     set{ 
      if (!_value.Equals(value)) 
      { 
       onChange(_value); 
       _value = value; 
      } 
     } 

    } 


    event onValChange onChange = delegate { }; 
    delegate void onValChange(T val); 

    IObservable<T> _observable; 
    public RxVar() { 

     _observable = Observable.FromEvent<onValChange,T>(ev => onChange += ev, ev => onChange -= ev); 
    } 



    public IDisposable Subscribe(IObserver<T> observer) 
    { 
     return _observable.Subscribe(p=>observer.OnNext(p)); 
    } 
} 

信號燈例如

 _semaphoreSlim.WaitOne(); 
     if (!_value.Equals(value)) 
     { 
      onChange(_value); 
      _value = value; 
     } 
     _semaphoreSlim.release(); 

好吧我想讓這個線程安全,並且我對死鎖感到恐慌,所以 使用lock或semaphone會更好,還是因爲不需要反應性本身?

謝謝。 :)

回答

3

我推薦一個鎖,而不是一個信號。信號量只是這種情況下的錯誤工具。

考慮與暴露的實際價值「迴歸_value」指的是,吸氣返回後,也客戶端代碼將能夠修改對象中的數據。所以問題是,如果你在公開參考資料之後會如何避免競爭條件?

答案是不公開的參考。給出對象/數據的深層拷貝,而不是原始對象本身。

關於死鎖:在所有的,如果你知道你在做什麼,你不應該害怕。如果你不這樣做,你會發現永遠不會有死鎖,因爲在每次運行中,條件可能會有所不同,甚至在經過多次成功的測試後,可能會導致死鎖和調試,這將是一件困難的事情。

死鎖只能通過學習才能避免,而不是通過「編程時不知道」的方式。

小片段與鎖:

類的實例字段(你需要這個,如果_value可以爲空,否則,你可以鎖定_value本身):

private object _valueLock = new Int(0); 

在你的方法:

lock(_valueLock) 
{ 
    if (_value != value) // this or deep equality 
    { 
     _value = value; 
     onChange(this, _value); // for complex Observer-Observable scenarios it's better specifying the observed object 
    } 
} 
+0

真的謝謝你,反正我不明白爲什麼semaphone不能做的工作:) – LXG

+1

信號量是最適合於其他場景,如[生產者/消費者(http://en.wikipedia.org/wiki/監製%E2 %80%93consumer_problem)或[讀者/作者](http://en.wikipedia.org/wiki/Readers-writers_problem)。這種情況是一個簡單的[互斥](http://en.wikipedia.org/wiki/Mutex),因此可能有更清晰的代碼和更有效的實現。 – pid