Python:互斥锁,线程同步及总结
资源竞争解决办法:
1.线程等待 join
2.互斥锁
同步:
线程同步:目的是按顺序进行
线程等待:
from threading import Thread,Lock a=0 b=1000000 #解决办法一 def sum1(): for i in range(b): global a #a为整型,修改值时引用地址会改变,需声明 a+=1 print(f'第一次:{a}\n',end='') def sum2(): for i in range(b): global a #a为整型,修改值时引用地址会改变,需声明 a+=1 print(f'第二次:{a}\n',end='') if __name__ == "__main__": # 创建线程 thread = Thread(target=sum1) thread1 = Thread(target=sum2) # 启动线程 thread.start() thread.join() thread1.start() # 等待线程结束 # thread.join() # thread1.join()
互斥锁:能够保证多个线程访问共享数据不会出现数据错误问题,对共享数据进行锁定,保证同一时刻只能有一个线程操作
互斥锁的使用:
1.threading模块中定义Lock() 锁
2.acquire 加锁 release 释放锁
3.如果在调用acquire方法时,其他线程已经使用了这个互斥锁,那么此时acquire方法会堵塞,知道这个互斥锁释放后才能再次上锁
4.Lock有acquire()和release(),成对出现的,先加锁释放锁才能再加锁等操作,否则会造成死锁
from threading import Thread,Lock a=0 b=1000000 #解决办法一 #1.创建全局互斥锁 lock=Lock() def sum1(): lock.acquire()#加锁 for i in range(b): global a #a为整型,修改值时引用地址会改变,需声明 a+=1 print(f'第一次:{a}\n',end='') lock.release()#解锁 def sum2(): lock.acquire() for i in range(b): global a #a为整型,修改值时引用地址会改变,需声明 a+=1 print(f'第二次:{a}\n',end='') lock.release() if __name__ == "__main__": # 创建线程 thread = Thread(target=sum1) thread1 = Thread(target=sum2) # 启动线程 thread.start() thread1.start() # 等待线程结束 thread.join() thread1.join()
输出结果为:
第一次:1000000
第二次:2000000