BZ易风

导航

 

因为多线程运行时要争夺资源,导致同事写入全局变量的时候回出现问题 所以用互斥锁可以解决这个问题

没有上锁的时候

 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

 

posted on 2019-08-20 14:43  BZ易风  阅读(211)  评论(0编辑  收藏  举报