Test-and-set

Test-and-set — простая неразрывная (атомарная) процессорная инструкция, которая копирует значение переменной в регистр, и устанавливает некое новое значение. Во время исполнения данной инструкции процессор не может прервать её выполнение и переключиться на выполнение другого потока. Если используется многопроцессорная архитектура, то, пока один процессор выполняет эту инструкцию с ячейкой памяти, другие процессоры не могут получить доступ к этой ячейке, что может достигаться путём кратковременного блокирования шины памяти.

Пример:

  enter_critical_section:   TSL REGISTER, LOCK // Значение переменной LOCK копируется в регистр                         // и устанавливается в 1.      CMP REGISTER, #0   // Старое значение сравнивается с нулем.      JNE enter_critical_section // Если оно ненулевое, значит кто-то уже вошел в критическую секцию и заблокировал её.           RET                // Блокировка выполнена успешно, возвращаемся в вызывающую функцию. 

При этом разблокирование ячейки производится обычной процедурой MOV:

  leave_critical_section:      MOV LOCK, #0   // Разблокирование переменной.       RET            // Возврат в вызывающую функцию.