import threading import time lock = threading.Lock() # step 1: 创建互斥锁 share_data = 0 def tstart(arg): time.sleep(0.1) global share_data if lock.acquire(): # step 2: 获取互斥锁,否则阻塞当前线程 share_data += 1 lock.release() # step 3: 释放互斥锁 if __name__ == '__main__': tlst = list() for i in xrange(10): t = threading.Thread(target=tstart, args=('',)) tlst.append(t) for t in tlst: t.start() tlst[2].join() print("This is main function at:%s" % time.time()) print 'share_data result:', share_data
结果:
This is main function at:1564909315.86 share_data result: 7
上面的share_data结果有一定的随机性,因为我们只等待第二个线程执行结束就直接读取结果然后结束主线程了。
不过从上面这个结果我们可以推断出,当第三个线程结束且主线程执行到输出share_data的结果时,至少七个线程完成了对share_data的加1操作;
重入锁RLock
由于当前线程获得锁之后,在释放锁之前有可能再次获取锁导致死锁。python引入了重入锁。