线程间通信
---线程由于是在同一个进程中,所以线程间通信使用全局变量进行通信
共享资源:
多个线程都可以操作的资源为共享资源,对共享资源的操作代码段称为临界区。对共享资源的无序操作可能会带来数据的混乱,或者操作错误。此时往往需要同步互斥机制协调操作顺序。
--同步机制:比如消息队列,管道就属于同步机制
 
--互斥机制:

互斥使用的方法:
----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()

线程死锁的问题:
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
简单来说造成死锁的原因可以概括成三句话:
当前线程拥有其他线程需要的资源,
当前线程等待其他线程已拥有的资源,
都不放弃自己拥有的资源

 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号