2016-06-13 3 views
0

Во время чтения 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() вызов в конце. Нужен ли этот вызов только для того, чтобы получить поток в однопоточной среде или у него есть дополнительная цель?

ответ

1

Короткий ответ ... Да. Цель SpinWait состоит в том, чтобы разрешить подачу нити в Систему, чтобы не подвергать голод обработке из-за SpinLock.

Из MSDN

https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx

SpinWait инкапсулирует общую логику прядения. На однопроцессорных машинах выходы всегда используются вместо занятости, а на компьютерах с процессорами Intel, использующими технологию Hyper-Threading, помогает предотвратить голодовку аппаратных нитей. SpinWait инкапсулирует хорошую смесь спиннинга и истинного урожая.

SpinWait - тип значения, что означает, что низкоуровневый код может использовать SpinWait, не опасаясь лишних затрат на распределение. SpinWait - , обычно не полезный для обычных приложений. В большинстве случаев вы должны использовать классы синхронизации, предоставляемые платформой .NET Framework, , например Monitor. Для большинства целей, когда требуется ожидание очереди, , однако, тип SpinWait должен быть предпочтительнее метода SpinWait .

 Смежные вопросы

  • Нет связанных вопросов^_^