如果没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为“线程不安全”。
线程同步解决问题:
- 系统调用t1,然后获取到num的值为0,此时上一把锁,即不允许其他现在操作num
- 对num的值进行+1
- 解锁,此时num的值为1,其他的线程就可以使用num了,而且是num的值不是0而是1
- 同理其他线程在对num进行修改时,都要先上锁,处理完后再解锁,在上锁的整个过程中不允许其他线程访问,就保证了数据的正确性
from threading import Thread, Lock
num =0 # 资源竞争问题
mutex= Lock() # 创建一个互斥锁
def fun1():
global num
for i in range(1000000):
mutex.acquire()
# acquire 首先判断锁的当前状态,如果锁处于上锁状态,则默认处于阻塞等待,
# 等待直到锁变成未上锁状态的时候,才能继续向下运行
# 如果一旦发现锁处于未上锁状态,则将锁设置为上锁
num += 1
mutex.release() # 释放锁,表示将锁设置为打开状态
def fun2():
global num
for i in range(1000000):
mutex.acquire()
num += 1
mutex.release() # 释放锁,表示将锁设置为打开状态
t1 =Thread(target=fun1) # 创建一个线程对象
t2 =Thread(target=fun2) # 创建一个线程对象
t1.start() # 开启线程的执行
t2.start()
t1.join() # 回收线程资源
t2.join()
print(num)