0

double変数を共有しているとします。スレッドAは、毎秒数千回更新します。別のスレッドBでは、これが発生するたびに「更新」について何らかの形で通知したいと考えています。

通知を完全に回避してwhile(true)ループのみを使用しようとしましたが、これによりプログラムのロックフリー計算が大幅に遅くなりました: 他のスレッドによって変更されている N 個の倍精度数を合計する方法は? おそらく、「その間、同じ配列をメモリから何度もロードし続けますが、メモリ帯域幅が限られているため、パフォーマンスにはあまり適していません。」

classも使用しMonitorてみましたが、かなり遅く、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 に答える