条件变量:允许线程阻塞等待另一个线程发送信号唤醒。条件变量被用来阻塞一个线程,当条件不满足时,线程解开相应的互斥锁并等待条件发生变化。如果其他线程改变了条件变量,并且使用条件变量换型一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。条件变量被用来进行线程间的同步。
thread 1
con = threading.Condition() #创建条件变量
while True:
do something
con.acquire() #获取锁
con.notify() #唤醒等待线程
con.release() #释放锁
thread 2
con.acquire()
while True:
con.wait() #等待唤醒,释放锁
do something
con.release() #释放锁
条件变量实质:某一时刻只有一个线程访问公共资源。其他线程做其他任务或者休眠。
使用条件变量实现生产者和消费者。
import threading
import time
tmp = 0
g_cond = threading.Condtion()
def thread_func():
global g_cond
global tmp
g_cond.acquire()
while True:
if tmp >= 3:
tmp = tmp – 1
print “sub tmp = ”,tmp
else:
g_cond.wait()
print “wake up by another thread”
g_cond.release()
if __name__ == “__main__”:
p = threading.Thread(target=thread_func,args=())
p.setDaemon(True)
p.start()
while True:
g_cond.acquire()
print “main tmp=”,tmp
if tmp > 3:
print “notify sub thread”
g_cond.notify()
else:
tmp += 1
g_cond.release()
p.join()