我正在实现监视器同步。我想知道实现多个条件变量是如何工作的。因此,一个条件变量有一个方法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队列中的内容还是与锁关联的组合队列。
发布于 2010-10-01 16:38:59
A.notifyAll()只应该唤醒运行foo()的线程。线程是wait()-ing的等待队列是条件变量的一部分,而不是锁。锁确实有自己的等待队列,但只有试图获取锁的线程才会使用它。当你的线程在简历中睡觉时,它不会持有锁,除非另一个线程调用notify()或类似的线程,否则不会尝试重新获取它。
也就是说,您应该编写代码,以假设B.wait()实际上可以在任何时候醒来。实际上,这意味着重新检查线程正在等待的条件:
with lock:
while not ready:
B.wait()
# Do stuff with protected datahttps://stackoverflow.com/questions/3826167
复制相似问题