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