1 互斥锁解决资源竞争-重点
1.1 资源竞争产生原因:
1 多线程共享全局资源
2 多个线程不加限制随意访问全局资源 产生竞争 导致数据错误
1.2 互斥锁使用
加互斥锁(保证任意时刻只有一个线程能够占有锁)
1 访问资源先加锁 (已被占用则等待直到别人释放) ;2 使用 ;3 完成释放锁
import threading
g_number = 0
def update_number(lock):
"""让子进程运行"""
global g_number
for i in range(10000000):
# 尝试加锁 如果没有人锁定 成功;如果有人 等待
lock.acquire()
g_number += 1
# 释放锁
lock.release()
if __name__ == '__main__':
# 在门上安装一把互斥所
lock = threading.Lock()
# 1 创建一个子线程 运行 update_number
thd1 = threading.Thread(target=update_number, args=(lock,))
thd1.start()
thd2 = threading.Thread(target=update_number, args=(lock,))
thd2.start()
# 2 创建一个全局变量
# 3 让子线程修改全局变量
# 4 让主线程等待子线程退出 打印全局变量的值
# 如果这个值和子线程设置的值 说明线程间共享全局资源 ; 否则不共享
thd1.join()
thd2.join()
print("得到最终值为%s" % g_number)
1.3 互斥锁优缺点
优点:
能够解决资源竞争问题
缺点:
执行效率低(多线程模式变成 one-by-one 串行)