A SpinLock - это просто цикл, пытающийся установить переменную для определенного значения.
Вы можете рассмотреть ее реализацию следующим образом:
public struct SpinLock
{
private volatile bool _Locked;
public void Acquire()
{
while (_Locked)
;
_Locked = true;
}
public void Release()
{
_Locked = false;
}
}
(конечно, приведенный выше код не является потокобезопасным, и я знаю, что это не сигнатура методов класса, это просто вариант псевдокода, чтобы показать, что он делает)
Так что да,если SpinLock уже находится в заблокированном состоянии, попытка получить его будет вращаться до тех пор, пока он не станет доступным.
Также обратите внимание, что по умолчанию (как в вашем примере) структура не отслеживает, кому принадлежитзамок.Это означает, что если поток попытается получить блокировку дважды, он будет взаимоблокировать сам с собой со второй попытки.
Цель SpinLock - блокировка на уровне пользователя с небольшими накладными расходами.Он не добавляет давления GC и не выделяет какой-либо объект синхронизации ядра, это просто структура с несколькими полями.