互斥锁,数据共享不安全问题

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)

 

posted @ 2021-02-04 22:25  苦行僧冬*婷  阅读(58)  评论(0)    收藏  举报