2012-07-09 51 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并继续前进。