互斥锁,数据共享不安全问题
1.+= -= *= /= if while会数据不安全
import dis a = 1 def func(): global a a += 1 print(dis.dis(func))
上面函数通过dis模块查看底层指令如下
底层指令
108 0 LOAD_GLOBAL 0 (a) 把a加载到cpu中
3 LOAD_CONST 1 (1) 把常量加载到cpu中
6 INPLACE_ADD 加操作
==============这里可能会时间片轮转 GIL锁切换成另一个线程,等时间片回来再接着赋值可能出错
7 STORE_GLOBAL 0 (a) |给a赋值
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
解决问题就是加锁
from threading import Thread,Lock n = 0 def add(lock): global n for i in range(500000): with lock: n += 1 def sub(lock): global n for i in range(500000): with lock: n -= 1 if __name__ == '__main__': t_l =[] lock = Lock() for i in range(10): t1 = Thread(target=add,args=(lock,)) t1.start() t2 = Thread(target=sub,args=(lock,)) t2.start() t_l.append(t1) t_l.append(t2) for t in t_l: t.join() print(n)