Это зависит от вашей операционной системы. Я видел, как только вращался, вращался с yield
, переменными состояния общего назначения в ядре, контролируемым пользовательским планированием и специальными фиксирующими примитивами с поддержкой ядра.
Спиннинг и спиннинг с yield
имеют ужасное представление. Теоретически контролируемое пользователем планирование (см. Scheduler activations) должно иметь наилучшую производительность, но насколько я знаю, никто никогда не делал его работоспособным во всех случаях. Переменные условия общего назначения в ядре и специальные блокирующие примитивы с поддержкой ядра должны работать более или менее одинаково с futex в Linux как лучший пример последнего.
Бывают ситуации, когда спиннинг может иметь лучшую производительность. В Solaris некоторый фиксирующий примитив в ядре имеет адаптивный режим, в котором блокировка вращается до тех пор, пока процесс, удерживающий блокировку, работает на другом процессоре. Если владелец замка спит или получает превенцию, официант замка тоже ложится спать. В других ядрах есть классы блокировок, в которых владелец замка не может быть выгружен или спящий, удерживая замок, поэтому в этих случаях вращение тоже хорошо работает. В общем, хотя, в частности, в userland, вращение имеет такие ужасные дегенеративные случаи (процесс прядения вращается, пока он не освобождается, чтобы позволить владельцу замка работать), что это очень плохо для производительности. Обратите внимание, что специализированные блокирующие примитивы, такие как futex
, могут реализовывать такие оптимизации, что обычно не могут использоваться для переменных общего назначения.
'Я думаю, что принцип взаимного исключения гарантирует, что в критический раздел одновременно войдут 2 или более потока. Теперь, есть ли у вас очередь для потоков, которые пытаются заблокировать мьютекс, или вы просто делаете ожидание до тех пор, пока мьютекс не будет свободен, зависит от того, как вы его реализуете и каковы ваши потребности в мьютексе. Например, «mutex» в RTOS, например VxWorks, реализует приоритетный потоковый протокол, который вам может не понадобиться в ОС общего назначения (GPOS). – Raj