0

假设我有共享double变量。线程A每秒更新数千次。在另一个线程B中,每次发生这种情况时,我都希望以某种方式收到有关“更新”的通知。

我试图完全避免通知,只使用while(true)循环,但这给我的程序无锁计算带来了显着的减速:如何对其他线程正在改变的 N 个双数求和?可能是因为“同时你不断地从内存中加载同一个数组,这对性能来说并不是很好,因为内存带宽是有限的。”

我也尝试过使用Monitorclass 但它也很慢,而且我看到Monitor.TryEnterreturn时延迟高达 1-2 毫秒false

我现在认为我需要使用无锁技术进行通知,可能使用SpinLock或其他方式?

4

2 回答 2

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;
        }
    }
于 2012-07-09T13:00:00.760 回答
0

不要一直保持通知线程。当线程 A 更改值时,他应该通知线程 B 并继续前进。

于 2012-07-09T12:59:47.220 回答