使用Condition对象

作为使用“条件”对象在python中练习线程间通信的一部分,我编写了以下代码

from threading import *
import time
c=Condition()

def sum():
    time.sleep(2)#if i comment this line then pgm waits,only sum() fun print stmt is executed
    c.acquire()
    print('here after this stms notify is called')
    c.notify()
    c.release()

def display():
    c.acquire()
    c.wait()
    print('display print is executing after notify')
    c.notify()
    c.release()

def show():
    c.acquire()
    c.wait()
    print('show print is executing after notify')
    c.release()

t2=Thread(target=display)
t3=Thread(target=show)
t1=Thread(target=sum)
t1.start()
t2.start()
t3.start()

pgm工作正常,但是如果我在time.sleep(2)函数中注释sum(),则仅执行sum()函数的print stmt,然​​后等待。请告诉我为什么会发生这种情况,为什么这行time.sleep(2)会真正改变这种情况

sdl2874 回答:使用Condition对象

wait方法等待另一个线程通过调用notify来唤醒它。这意味着我们必须在调用wait之前 在线程上调用notify。发生的事情是,sum处于休眠状态,允许displayshow线程调用wait。在sum函数调用notify时,其中一个被唤醒并可以被调用。

time.sleep(2)不在sum函数中时,sum函数正在获取c并运行到display或{{1 }}函数可以进入show状态。请注意,这是一种竞争条件,在某些情况下它可能会按您希望的那样工作。

此外,由于错过了wait方法中对notify的调用,因此存在另一个潜在的竞争条件,这意味着未调用show函数。这是因为display默认会唤醒一个线程。因此,只有在首先唤醒运行notify的线程时,此操作才能完成。

回应您对事件与条件之间差异的评论。事件是线程之间进行通信的一种轻量级方式。一个线程可以发出事件信号,并且任何数量的线程都可以等待事件。通知事件后,所有线程将唤醒并执行。没有锁。事件通常不足以保护线程之间共享的状态。

使用条件变量时,将使用锁,这意味着只有一个等待条件变量的线程才能获取该锁。这对于保护共享状态很有用。

本文链接:https://www.f2er.com/3072392.html

大家都在问