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 // Возврат в вызывающую функцию.