多線程-共享全局變量問題
多線程開發可能遇到的問題
假設兩個線程t1和t2都要對全局變量g_num(默認是0)進行加1運算,t1和t2都各對g_num加10次,g_num的最終的結果應該為20。
但是由於是多線程同時操作,有可能出現下面情況:
在g_num=0時,t1取得g_num=0。此時系統把t1調度為”sleeping”狀態,把t2轉換為”running”狀態,t2也獲得g_num=0
然后t2對得到的值進行加1並賦給g_num,使得g_num=1
然后系統又把t2調度為”sleeping”,把t1轉為”running”。線程t1又把它之前得到的0加1后賦值給g_num。
這樣導致雖然t1和t2都對g_num加1,但結果仍然是g_num=1
測試1
import threading import time g_num = 0 def work1(num): global g_num for i in range(num): g_num += 1 print("----in work1, g_num is %d---"%g_num) def work2(num): global g_num for i in range(num): g_num += 1 print("----in work2, g_num is %d---"%g_num) print("---線程創建之前g_num is %d---"%g_num) t1 = threading.Thread(target=work1, args=(100,)) t1.start() t2 = threading.Thread(target=work2, args=(100,)) t2.start() while len(threading.enumerate()) != 1: time.sleep(1) print("2個線程對同一個全局變量操作之后的最終結果是:%s" % g_num)
運行結果:
---線程創建之前g_num is 0--- ----in work1, g_num is 100--- ----in work2, g_num is 200--- 2個線程對同一個全局變量操作之后的最終結果是:200
測試2
import threading import time g_num = 0 def work1(num): global g_num for i in range(num): g_num += 1 print("----in work1, g_num is %d---"%g_num) def work2(num): global g_num for i in range(num): g_num += 1 print("----in work2, g_num is %d---"%g_num) print("---線程創建之前g_num is %d---"%g_num) t1 = threading.Thread(target=work1, args=(1000000,)) t1.start() t2 = threading.Thread(target=work2, args=(1000000,)) t2.start() while len(threading.enumerate()) != 1: time.sleep(1) print("2個線程對同一個全局變量操作之后的最終結果是:%s" % g_num)
運行結果:
---線程創建之前g_num is 0--- ----in work1, g_num is 1088005--- ----in work2, g_num is 1286202--- 2個線程對同一個全局變量操作之后的最終結果是:1286202
結論
如果多個線程同時對同一個全局變量操作,會出現資源競爭問題,從而數據結果會不正確
==================================================================
注:以上課程筆記為學習時整理的老師課堂學習筆記,如需轉載,如需完整筆記,請私聊聯系我。
專題Python每天更新我的學習筆記。以上內容整理與上課筆記,更多詳情查看原文鏈接,我的公眾號干貨持續更新中
原文鏈接:文章Python開發者交流平台
如果你有更好的心得和建議,歡迎拍磚一起探討。歡迎搜索公眾號加入【 python開發者交流平台 】
