Python多线程锁失效问题:为何线程2提前触发?
你的线程锁没生效的核心原因分析
你的代码里根本没让第二个线程参与锁竞争——线程tt2对应的xx1函数完全没碰lock1,它既不尝试获取锁,也不依赖锁的状态,所以tt1启动后,tt2会直接跑自己的代码,和锁半毛钱关系都没有。
至于你说加join()后正常,那只是让主线程等tt1跑完再启动tt2,这是线程等待机制,不是锁的作用,本质是把并行改成了串行,和锁的同步逻辑完全是两码事。
怎么改才能让锁生效?
要让tt2等tt1释放锁后再执行关键逻辑,必须给xx1也加上锁的获取和释放步骤,比如:
import threading import time def xx(): print("locking the thread") lock1.acquire() time.sleep(1) print("thread locked") time.sleep(1) lock1.release() def xx1(): print("waiting for lock...") lock1.acquire() # 这里会阻塞,直到tt1释放锁 print("thread lock released") lock1.release() lock1 = threading.Lock() tt1 = threading.Thread(target=xx) tt2 = threading.Thread(target=xx1) tt1.start() tt2.start()
关键提醒
- 线程锁的本质是让多个线程竞争同一把锁,从而实现代码块的互斥执行,只有所有需要同步的线程都对同一锁进行
acquire()和release()操作,锁才能发挥作用。 - 别把
join()和锁搞混:join()是强制等待某个线程结束,是线程生命周期的控制;锁是控制线程间的执行顺序,针对的是代码块的互斥访问。
内容的提问来源于stack exchange,提问作者thomas antony
相关产品推荐
相关产品推荐

