為全域性變數賦值 關於多執行緒使用全域性變數的問題

2021-10-16 03:58:04 字數 2157 閱讀 5588

# -*- 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有...