3

Albahari の Threading in C#を読んでいるときに、「ロック フリー アップデート」パターンSpinWaitがサイクルの最後に a を使用していることに気付きました。

static void LockFreeUpdate<T> (ref T field, Func <T, T> updateFunction)
  where T : class
{
    var spinWait = new SpinWait();
    while (true)
    {
        // read
        T snapshot1 = field;

        // apply transformation
        T calc = updateFunction (snapshot1);

        // compare if not preempted
        T snapshot2 = Interlocked.CompareExchange (ref field, calc, snapshot1);

        // if succeeded, we're done
        if (snapshot1 == snapshot2) return;

        // otherwise spin
        spinWait.SpinOnce();
    }
}

spinWait.SpinOnce()最後の呼び出しに注意してください。この呼び出しは、シングルスレッド環境でスレッドを生成するためだけに必要ですか、それとも別の目的がありますか?

4

1 に答える 1