# -*- coding:utf-8 -*-import threadingimport time#定義乙個全域性變數g_num = 0def test1(num): global g_num for i in range(num): g_num += 1 print(g_num)def test2(num): global g_num for i in range(num): g_num += 1 print(g_num)def main(): t1 = threading.thread(target=test1,args=(10000000,)) t2 = threading.thread(target=test2,args=(10000000,)) t1.start() t2.start() time.sleep(5) print('結束:',g_num)if __name__ == '__main__': main()
執行後得到的結果本應是20000000,可是結果真是這樣嗎?執行後得到的結果是:
這是因為乙個程式在未執行完全時就被休眠而執行另乙個程式了,從而導致這樣的結果。說明多個執行緒同時對乙個全域性變數進行操作,會出現資源競爭問題,從而資料結果會不正確,導致執行緒安全問題。簡單來說:
在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
那麼怎麼解決這個問題呢?這裡就用到了多執行緒的互斥鎖。具體參見下面的程式:
# -*- coding:utf-8 -*-import threadingimport time#定義乙個全域性變數g_num = 0def test1(num): global g_num #上鎖 mutex.acquire() for i in range(num): g_num += 1 #解鎖 mutex.release() print(g_num)def test2(num): global g_num # 上鎖 mutex.acquire() for i in range(num): g_num += 1 mutex.release() print(g_num)def main(): t1 = threading.thread(target=test1,args=(10000000,)) t2 = threading.thread(target=test2,args=(10000000,)) t1.start() t2.start() time.sleep(3) print('結束:',g_num)if __name__ == '__main__': mutex = threading.lock() main()
當多個執行緒幾乎同時修改共享資料時,需要進行同步控制
執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制就是引入互斥鎖。
互斥鎖為我們的資源引入乙個狀態:鎖定/非鎖定
某個執行緒要更改共享資料時,先將其鎖定,此時,資源的狀態為鎖定,其他執行緒不能對其更改;
直到該執行緒釋放資源,資源狀態變為非鎖定狀態,其他執行緒才能再次鎖定該資源。
互斥鎖,保證了每次只有乙個執行緒進行寫入操作,從而保證了多執行緒情況下資料的正確性。
在threading模組裡,定義了lock()類,可以方便的處理鎖定。
此時我們就可以得到我們想要的答案了:
7 多執行緒 全域性變數 共享全域性變數
多執行緒 全域性變數 共享全域性變數 多執行緒可以對全域性變數進行修改,修改後的結果會影響下乙個執行緒 程序不可以共享全域性變數,子程序是複製父程序的全域性變數,修改後互不影響 from threading import thread import time,random g num 100 def...
python關於多執行緒使用全域性變數的問題
在多執行緒中,如果多執行緒同時對乙個全域性變數進行操作時,就有可能出現異常,比如下面的程式 coding utf 8 import threading import time 定義乙個全域性變數 g num 0def test1 num global g num for i in range num...
多執行緒共享變數 多執行緒共享全域性變數
1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...