2012-07-09 48 views
0

假設我共享double變量。線程A每秒更新數千次。在另一個線程B我想每次發生這種情況時都會收到有關「更新」的通知。無鎖技術通過從一個線程到另一個線程的雙重更新

我想完全避免的通知,只是使用while(true)循環,但這種引進顯著放緩到我的程序lock-free calc: how to sum N double numbers that are changing by other threads?的可能,因爲「同時你繼續加載,從內存一遍又一遍這同一陣列是不是表現確實不錯因爲內存帶寬有限。「

我也試過使用Monitor類,但它也很慢,我已經看到長達1-2毫秒的延遲,當Monitor.TryEnter返回false

我現在認爲我需要使用無鎖技術進行通知,可能使用SpinLock或其他東西?

回答

3

使用等待句柄的線程

System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false); 
    double d = 0; 
    public void ThreadA(object state) 
    { 
     while (true) 
     { 
      d++; 
      are.Set(); 
     } 
    } 

    public void ThreadB(object state) 
    { 
     while (true) 
     { 
      are.WaitOne(); 
      double current = d; 
     } 
    } 
+0

之間,通知我喜歡,但問題是AutoResetEvent'多少開銷'介紹。 – javapowered 2012-07-09 13:31:57

+0

我沒有測試這個。您可以測試1000個迭代的代碼塊並檢查執行這些迭代所需的時間,然後使用鎖檢查相同的迭代。那麼你可以知道結果。 – Waqar 2012-07-09 14:37:38

0

不要始終保持通知的線程。當線程A改變該值時,他應該通知線程B並繼續前進。