线程间通信

---线程由于是在同一个进程中,所以线程间通信使用全局变量进行通信

 

共享资源:

多个线程都可以操作的资源为共享资源,对共享资源的操作代码段称为临界区。对共享资源的无序操作可能会带来数据的混乱,或者操作错误。此时往往需要同步互斥机制协调操作顺序。

--同步机制:比如消息队列,管道就属于同步机制

 

 

 

 

 

--互斥机制:

  互斥使用的方法:

  ----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()
复制代码

 

线程死锁的问题:

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。

简单来说造成死锁的原因可以概括成三句话:
当前线程拥有其他线程需要的资源,
当前线程等待其他线程已拥有的资源,
都不放弃自己拥有的资源

 

posted @   powfu  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示