请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

wait和notify的疑惑

老师您好,
notify方法的源码中直接释放锁,执行完notify方法后,不是应该直接执行xiaoai的代码段了吗?为何tianmao的wait方法执行后才会执行xiaoai的代码段呢?
print(“小爱同学”)
self.cond.notify()
self.cond.wait()

正在回答 回答被采纳积分+3

3回答

bobby 2021-02-21 21:08:52

你可以这样理解, condition只有的wait只有通过condition的notify才能唤醒,所以xiaoai只有通过天猫的notify之后才能启动

0 回复 有任何疑惑可以回复我~
  • 提问者 宗介呀 #1
    老师,您说的这个我是明白的,我的疑惑是,当前线程在调用notify方法后,自身线程会被阻塞或者说停止吗?因为唤醒了其他的线程,这个唤醒的动作,源码里面是直接release锁,但是我在当前线程wait方法前加了print测试的时候发现,在执行了唤醒后,也执行了wait前面的print,对于这个表示不解。
    回复 有任何疑惑可以回复我~ 2021-02-22 14:01:59
  • bobby 回复 提问者 宗介呀 #2
    执行notify之后的逻辑是否会执行 其实最好的验证方法就是自己写代码测试一下
    回复 有任何疑惑可以回复我~ 2021-02-22 21:54:13
提问者 宗介呀 2021-02-20 17:10:10

import threading
from threading import Condition


class XiaoAi(threading.Thread):
   def __init__(self, cond):
       super().__init__(name="小爱")
       self.cond = cond

   def run(self):
       with self.cond:
           self.cond.wait()
           print("在呢")
           self.cond.notify()

           self.cond.wait()
           print("好的")
           self.cond.notify()

           self.cond.wait()
           print("近看还是一头猪")
           self.cond.notify()


class TianMao(threading.Thread):
   def __init__(self, cond):
       super().__init__(name="天猫精灵")
       self.cond = cond

   def run(self):
       with self.cond:
           print("小爱同学")
           self.cond.notify()
           self.cond.wait()

           print("我们来对古诗吧")
           self.cond.notify()
           self.cond.wait()

           print("远看一头猪")
           self.cond.notify()
           self.cond.wait()


if __name__ == '__main__':
   # condition有两层锁,一把地层锁,会在线程调用了wait的时候进行释放,上面的锁,会在每次调用wait的时候分配一把,并放到condition的等待队列中,等待notify方法的唤醒
   cond = Condition()
   xiao_ai = XiaoAi(cond)
   tian_mao = TianMao(cond)

   xiao_ai.start()
   tian_mao.start()

0 回复 有任何疑惑可以回复我~
bobby 2021-02-20 17:00:46

你发一下完整的代码 我看看

0 回复 有任何疑惑可以回复我~
  • 提问者 宗介呀 #1
    import threading
    from threading import Condition
    
    
    class XiaoAi(threading.Thread):
        def __init__(self, cond):
            super().__init__(name="小爱")
            self.cond = cond
    
        def run(self):
            with self.cond:
                self.cond.wait()
                print("在呢")
                self.cond.notify()
    
                self.cond.wait()
                print("好的")
                self.cond.notify()
    
                self.cond.wait()
                print("近看还是一头猪")
                self.cond.notify()
    
    
    class TianMao(threading.Thread):
        def __init__(self, cond):
            super().__init__(name="天猫精灵")
            self.cond = cond
    
        def run(self):
            with self.cond:
                print("小爱同学")
                self.cond.notify()
                self.cond.wait()
    
                print("我们来对古诗吧")
                self.cond.notify()
                self.cond.wait()
    
                print("远看一头猪")
                self.cond.notify()
                self.cond.wait()
    
    
    if __name__ == '__main__':
        # condition有两层锁,一把地层锁,会在线程调用了wait的时候进行释放,上面的锁,会在每次调用wait的时候分配一把,并放到condition的等待队列中,等待notify方法的唤醒
        cond = Condition()
        xiao_ai = XiaoAi(cond)
        tian_mao = TianMao(cond)
    
        xiao_ai.start()
        tian_mao.start()
    回复 有任何疑惑可以回复我~ 2021-02-20 17:09:48
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信