线程间通信
---线程由于是在同一个进程中,所以线程间通信使用全局变量进行通信
共享资源:
多个线程都可以操作的资源为共享资源,对共享资源的操作代码段称为临界区。对共享资源的无序操作可能会带来数据的混乱,或者操作错误。此时往往需要同步互斥机制协调操作顺序。
--同步机制:比如消息队列,管道就属于同步机制
--互斥机制:
互斥使用的方法:
----Event()方法
e = Event() 创建线程event对象
e.wait([timeout]) 阻塞等待e被set
e.set() 设置e,使wait结束阻塞
e.clear() 使e回到未被设置状态
e.is_set() 查看当前e是否被设置
from threading import Thread,Event from time import sleep s = None #用于通信 e = Event() #事件对象 def fun(): print('杨子荣前来拜山头') global s s = '天王盖地虎' e.set() t = Thread(target=fun) t.start() print('说多口令就是自己人') e.wait() #必须先等子线程先操作完s,再进行验证 if s == '天王盖地虎': # print('口令正确') else: print('口令错误') t.join()
---线程锁
即在对共享资源操作时,先进行上锁操作,不允许其他线程操作该变量,等本线程操作完成后,再解锁,供其他线程操作
lock = Lock() 创建锁对象
lock.acquire() 上锁 如果lock已经上锁再调用会阻塞
lock.release() 解锁
with lock: 上锁
...
...
with代码块结束自动解锁
'''线程锁 ''' from threading import Thread,Lock from time import sleep a = b = 0 lock = Lock() def value(): while True: lock.acquire() #上锁 if a != b: print('a=%d,b=%d'%(a,b)) lock.release() #解锁 t = Thread(target= value) t.start() while True: with lock: #上锁 a += 1 b += 1 #执行完后解锁 t.join()

线程死锁的问题:
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
简单来说造成死锁的原因可以概括成三句话:
当前线程拥有其他线程需要的资源,
当前线程等待其他线程已拥有的资源,
都不放弃自己拥有的资源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律