2010-09-29 2 views
1

Я осуществляю синхронизацию монитора. Мне было интересно, как работает реализация нескольких переменных условий. Таким образом, переменная condition имеет метод wait(), который помещает его в очередь ожидания для определенного блокировки, привязанного к этой переменной условия. Итак, если у меня есть несколько переменных условия, каждый вызов ожидания создает свою собственную отдельную очередь ожидания? Для, например, если у меня есть:Синхронизация монитора: реализация нескольких переменных условия

lock = Lock() 
A = Condition(lock) 
B = Condition(lock) 
C = Condition(lock) 

def foo: 
    with lock: 
     while true: 
      A.wait() 

def bar: 
    with lock: 
     while true: 
      B.wait() 

def notifyA 
    with lock: 
     A.notifyAll() 

Так что мой вопрос заключается в том, что когда мы делаем A.notifyAll(), это только просыпается материал в A.wait очереди или это там комбинированные очереди на связанный с замок.

+0

внедрение на каком языке? – skaffman

+0

Реализация в Python – kj89

ответ

1

A.notifyAll() должен только просыпаться нить, проходящая foo(). Очередь ожидания ваших потоков равна wait()-in in является частью переменной , а не блокировки. У блокировки есть своя очередь ожидания, но она используется только потоками, пытающимися получить блокировку. Когда ваш поток спит в CV, он не удерживает блокировку и не будет пытаться повторно получить его, пока другой поток не вызовет notify() или аналогичный.

При этом вы должны написать свой код, чтобы предположить, что B.wait() действительно может просыпаться в любое время. Практически это означает повторную проверку состояния нити в ожидании:

with lock: 
     while not ready: 
      B.wait() 
     # Do stuff with protected data