因为多线程运行时要争夺资源,导致同事写入全局变量的时候回出现问题 所以用互斥锁可以解决这个问题
没有上锁的时候
1 import threading 2 import time 3 4 5 # 定义一个全局变量 6 g_num = 0 7 8 9 def test1(num): 10 global g_num 11 for i in range(num): 12 g_num += 1 13 print("------in test1 g_num=%d----" % g_num) 14 15 def test2(num): 16 global g_num 17 for i in range(num): 18 g_num += 1 19 print("------in test1 g_num=%d----" % g_num) 20 21 22 def main(): 23 t1 = threading.Thread(target=test1,args=(1000000,)) 24 t2 = threading.Thread(target=test2,args=(1000000,)) 25 26 t1.start() 27 t2.start() 28 29 time.sleep(2) 30 31 print("----in main g_num=%d-----" % g_num)
结果:
------in test1 g_num=1305261---- ------in test1 g_num=1285875---- ----in main g_num=1285875-----
如果按照预想的,结果应该是:2000000
出现原因--资源争夺
上锁后的情况
1 import threading 2 import time 3 4 5 # 定义一个全局变量 6 g_num = 0 7 8 9 def test1(num): 10 global g_num 11 # 上锁,如果之前没被上锁,那么此时上锁成功 12 # 如果上锁之前已经被上锁,那么此时会堵塞在这里,知道这个所被解开为止 13 mutex.acquire() 14 for i in range(num): 15 g_num += 1 16 # 解锁 17 mutex.release() 18 print("------in test1 g_num=%d----" % g_num) 19 20 def test2(num): 21 global g_num 22 mutex.acquire() 23 for i in range(num): 24 g_num += 1 25 mutex.release() 26 print("------in test1 g_num=%d----" % g_num) 27 28 29 # 创建一个互斥锁 默认是打开状态 30 mutex = threading.Lock() 31 32 33 def main(): 34 t1 = threading.Thread(target=test1,args=(1000000,)) 35 t2 = threading.Thread(target=test2,args=(1000000,)) 36 37 t1.start() 38 t2.start() 39 40 # 等待两个线程执行完毕 41 time.sleep(2) 42 43 print("----in main g_num=%d-----" % g_num)
结果
------in test1 g_num=1000000---- ------in test1 g_num=2000000---- ----in main g_num=2000000-----
test1抢先上锁,运行完毕后会解锁,然后test2接着上锁,得出结果:2000000