Spin-lock - это более или менее только общий int, в который синхронизируются записи.Специального флага для процессора нет.Таким образом, вы можете приобрести более одного спин-блокировки.(Вы не должны ...)
Для предотвращения блокировки однопроцессорной системы Windows поднимает IRQL до DISPATCH_LEVEL
.Процессор может иметь только один «поток», работающий на DISPATCH_LEVEL
, поэтому одновременная блокировка нескольких спин-блокировок безопасна в этих системах.и может расходиться из-за деталей)
LONG lock = 0;
KeAcquireSpinlock( ... )
{
// raise irql. etc.
while( InterlockedExchange( &lock, 1 ) != 0 )
/* do nothing*/;
}
KeReleaseSpinLock( ... )
{
InterlockedExchange( &lock, 0 );
// lower irql ... etc.
}
InterlockedExchange
гарантирует, что обмен происходит атомарно для всех процессоров на одной шине памяти.Поэтому он должен блокировать шину памяти или, по крайней мере, принудительно владеть конкретной строкой кэша.