2012-03-16 10 views
3
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)!

  • но как этот другой поток работать?
  • где именно происходит переключатель резьбы?
+0

Откуда этот код? –

+0

С лекционного слайда ... http://web.cecs.pdx.edu/~walpole/class/cs333/fall2006/slides/5.ppt –

ответ

1

block(thread) работает таким образом:

  1. разрешает прерывания
  2. использует какой-то механизм (предоставляемый операционной системой или занят ожидания в простейшем случае) ждет ждать, пока wakeup(thread) на этом поток вызывается. Это означает, что в этом пункте thread дает свое время планировщику.
  3. Отключает прерывания и возвращает.
+0

Механизм ожидания использует ** атомные операции ** (вы можете, например, проверить флаг в одной инструкции атомного процессора), так что вы можете работать с включенными прерываниями. –

0

Да, UP и DOWN в основном полезны при вызове из разных потоков, но не исключено, что вы называете их с одним потоком - если вы начнете семафора со значением> 0, то же самое поток может войти в критический раздел и выполнить как DOWN (до), так и UP (после). Значение, которое инициализирует семафор, указывает, сколько потоков может сразу войти в критический раздел, который может быть 1 (мьютекс) или любое другое положительное число.

Как создаются темы? Это не показано на слайде лекции, потому что это только принцип, как семафор работает с использованием псевдокода. Но это совершенно другая история, как вы используете эти семафоры в своем приложении.