监控同步:实现多个条件变量

时间:2010-09-29 21:55:52

标签: python synchronization operating-system monitor

我正在实施监控同步。我想知道如何实现多个条件变量。 所以条件变量有方法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队列中的东西,或者这是一个与锁相关联的组合队列。

1 个答案:

答案 0 :(得分:2)

A.notifyAll()应该只唤醒运行foo()的线程。线程为wait()的等待队列是条件变量的一部分,而不是 lock 。锁确实有自己的等待队列,但它只用于尝试获取锁的线程。当你的线程在CV中休眠时,它不会持有锁,并且在另一个线程调用notify()或类似线程之前不会尝试重新获取它。

那就是说,你应该编写你的代码,假设B.wait()实际上可以随时醒来。实际上这意味着重新检查线程正在等待的条件:

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