""" 线程共享资源也就是说共享全局资源,线程又是并发运行,因此当多个线程对同一个内存进行更改(写)操作时,会发生混乱 num = 0 线程1 获取num =0 线程2 获取num =0 线程1 num+=1 num = 1 线程1 num+=1 num = 2 线程1 num+=1 num = 3 线程2 num+=1 num = 1 即线程2获取的数据并不是3,因此发生家操作后并不是想要的结果 使用锁,每当数据进行更改,对该数据枷锁;执行完功能后,释放锁 锁可以是全局的,这样所有的入口函数都可以使用 多线程同时访问的全局数据才会发生混乱 必须调用 global 才能访问全局变量 """ import threading # 声明全局变量 num = 0 # 全局范围内声明一个锁实例 loa = threading.Lock() def funa(): """使用同一个锁的第一个入口函数""" for i in range(1000000): # 引用全局变量 global num # 锁定数据 loa.acquire() # 写(更改)操作 num += 1 # 释放资源 loa.release() def funb(): """使用同一个锁的第二个入口函数""" for i in range(1000000): # 引用全局变量 global num # 锁定数据 loa.acquire() # 写(更改)操作 num += 1 # 释放资源 loa.release() def main(): # 新建多个线程 t1 = threading.Thread(target=funa) t2 = threading.Thread(target=funb) # 开启线程 t1.start() t2.start() # 阻塞主线程,防止子线程随主线程结束 t1.join() t2.join() # 测试全局变量 print(num) if __name__ == '__main__': main()
数据枷锁安全
最新推荐文章于 2020-02-03 10:28:27 发布