Как правило, примитив синхронизации требует обновления нескольких местоположений данных одновременно . Например, для семафора Acquire может потребоваться изменить состояние текущего потока на заблокированное, обновить счетчик семафора, удалить текущий поток из очереди и поместить его в другую очередь. Поскольку одновременно невозможно (*), необходимо разработать протокол доступа для имитации этого. В системе с одним процессором самый простой способ сделать это - отключить прерывания, выполнить обновления, а затем снова включить прерывания. Все программное обеспечение, соответствующее этому протоколу, сразу увидит обновления.
В системах с несколькими процессорами обычно требуется что-то дополнительное, чтобы синхронизировать потоки на отдельных процессорах от вмешательства. Отключение прерываний недостаточно, поскольку это влияет только на текущий процессор. что-то дополнительное , как правило, является спин-блокировкой, которая во многом похожа на мьютекс или двоичный семафор, за исключением того, что вызывающая сторона находится в повторном режиме l oop до тех пор, пока она не станет доступной.
Даже в В системе с несколькими процессорами операция должна выполняться с отключенными прерываниями. Представьте, что поток № 0 получил спин-блокировку на процессоре № 0; затем прерывание на процессоре № 0 приводит к вытеснению потока № 1, а затем поток № 1 пытается получить тот же спин-блокировку. Существует множество сценариев ios, которые составляют это.
(*) Transaction-al Memory предоставляет что-то наподобие this, но с ограниченной применимостью, и реализация должна обеспечивать независимую реализацию обеспечить поступательный прогресс. Кроме того, поскольку транзакции не являются вложенными, им действительно необходимо отключать прерывания.