Во время чтения Albahari's Threading in C#, я заметил, что «замок бесплатное обновление» модель использует SpinWait
в конце цикла:SpinWait в обновлении беззамочные
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()
вызов в конце. Нужен ли этот вызов только для того, чтобы получить поток в однопоточной среде или у него есть дополнительная цель?