Wait(semaphore sem) {
DISABLE_INTS
sem.val--
if (sem.val < 0){
add thread to sem.L
block(thread)
}
ENABLE_INTS
Signal(semaphore sem){
DISABLE_INTS
sem.val++
if (sem.val <= 0) {
th = remove next
thread from sem.L
wakeup(th)
}
ENABLE_INTS
Если block(thread)
останавливает thread
от выполнения, как, где и когда он возвращается?Как реализовать псевдокод «работа» ожидания/сигнала (семафора)?
Какая нить разрешает прерывания после Wait()
? thread
, который называется block()
, не должен возвращаться, пока другая нить не вызвала wakeup(thread)
!
- но как этот другой поток работать?
- где именно происходит переключатель резьбы?
Откуда этот код? –
С лекционного слайда ... http://web.cecs.pdx.edu/~walpole/class/cs333/fall2006/slides/5.ppt –