Составители:
; новое значение mutex:=1
CMP REGISTER,0 ; предыдущее значение mutex сравнивается
; с нулем
JZE ok ; если оно нулевое – mutex не был блокирован
CALL thread_yield ; mutex занят, управление передается
; другому потоку
JMP mutex_lock ; повторить попытку позже
ok: RET ; возврат в вызывающую программу
; вход в критический участок
mutex_unlock ;
MOVE MUTEX,0 ; снятие блокировки, т.е. mutex:=0 и
; выход из критической секции
RET ; возврат
Процедура mutex_lock отличается от вышеприведенной процеду-
ры enter_region следующим образом. Процедура
enter_region находится в состоянии активного ожидания, т.е.
проверяет в цикле наличие блокировки до тех пор, пока критическая
секция не освободится или планировщик не передаст управление
другому процессу по истечении кванта времени. Однако в случае по-
токов ситуация меняется, поскольку нет прерываний по таймеру, ос-
танавливающих слишком долго работающие потоки [5]. Поток, пы-
тающийся получить доступ к семафору и находящийся в состоянии
активного ожидания, зациклится навсегда, так как он не позволит
предоставить процессор другому потоку, желающему снять блоки-
ровку. Поэтому, если войти в критическую секцию невозможно,
mutex_lock вызывает thread_yield, чтобы предоставить про-
цессор другому потоку. При следующем запуске поток снова прове-
ряет блокировку. Поскольку вызов thread_yield является обра-
щением к планировщику потоков в пространстве пользователя, об-
62
Страницы
- « первая
- ‹ предыдущая
- …
- 60
- 61
- 62
- 63
- 64
- …
- следующая ›
- последняя »