threading.Thread对象:有start()和run()方法。
threading.Lock对象:mutex, 有acquire(), release()方法。
threading.Condition对象:condition variable.有acquire(), release()方法。此外还有wait(), notify(), notifyAll()方法。
实例:
假设这样一个状况: 有100个工人,每人负责装修一个房间。当有10个房间装修完成的时候,老板就通知相应的十个工人一起去喝啤酒。我们如何实现呢?老板让工人在装修好房间之后,去检查已经装修好的房间数。但多线程条件下,会有竞争条件的危险。也就是说,其他工人有可能会在该工人装修好房子和检查之间完成工作。使用python解决。
#coding=utf8
'''
假设这样一个状况: 有100个工人,每人负责装修一个房间。当有10个房间装修完成的时候,老板就通知相应的十个工人一起去喝啤酒。
'''
import threading
num = 0
condition = threading.Condition()
def work(tid):
global num
global condition
condition.acquire()
num = num + 1
if num <= 10:
condition.wait()
print("worker", tid, "drink beer")
elif num == 11:
condition.notifyAll()
condition.release()
for i in range(100):
new_thread = threading.Thread(target = work, args = (i,))
new_thread.start()
wait()做两件事情,一个是释放lock,从而让别的工人可以建房。另一个是等待,直到notifyAll()的通知。这样的话,符合条件的线程就开始等待。
当num等于11时,notifyAll()会通知之前等待的线程,该线程锁住lock,继续执行,直到condition.release()释放lock,接着另一个等待的线程执行。