You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:05:47