多線程開發可能遇到的問題
假設兩個線程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
結論
- 如果多個線程同時對同一個全局變量操作,會出現資源競爭問題,從而數據結果會不正確