Как "работает" псевдокод реализации Wait / Signal (семафор)? - PullRequest
3 голосов
/ 17 марта 2012
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)!

  • , но как этот другой поток запускается?
  • где именно это происходитпроисходит переключение потока?

Ответы [ 2 ]

1 голос
/ 17 марта 2012

block(thread) работает следующим образом:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...