我正在实施监控同步。我想知道如何实现多个条件变量。 所以条件变量有方法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 :(得分:2)
A.notifyAll()
应该只唤醒运行foo()
的线程。线程为wait()
的等待队列是条件变量的一部分,而不是 lock 。锁确实有自己的等待队列,但它只用于尝试获取锁的线程。当你的线程在CV中休眠时,它不会持有锁,并且在另一个线程调用notify()
或类似线程之前不会尝试重新获取它。
那就是说,你应该编写你的代码,假设B.wait()
实际上可以随时醒来。实际上这意味着重新检查线程正在等待的条件:
with lock:
while not ready:
B.wait()
# Do stuff with protected data