執行緒中的全域性變數與搶占資源

2021-10-07 17:11:59 字數 2216 閱讀 6802

宣告乙個全域性變數,當我們修改全域性變數中的內容時,其他執行緒也會收到相應的修改。

import threading

import time

num =

100#global num

defdemo1()

:global num

for i in

range

(100):

num+=

1print

(f'----demo1---'

)def

demo2()

:global num

#num+=1

print

(f'----demo2-----'

)def

main()

:global num

t1 = threading.thread(target=demo1)

t2 = threading.thread(target=demo2)

t1.start(

) t2.start(

)print

(f'----main------'

)if __name__ ==

'__main__'

: main(

)

當range足夠大時,三者的資料會出現偏差,因為修改需要耗時,而其他執行緒此時得到的值是之前的值不是現在的值

當乙個讀乙個寫,此時兩個執行緒間沒有任何衝突,只要時間足夠長,資料是沒問題的

搶占資源驗證:

當兩個子執行緒都對乙個全域性變數進行修改的時候,也會因為資源搶占而導致變數的值不同:

如圖:

修改num的值時也是要經歷3個步驟的 獲取num的值,將獲取到的num+1 把第2步獲取到的值儲存到num

如果兩個執行緒存在搶占資源的情況,可能1執行獲取num值後還沒有進行+1,這個值已經被2執行緒搶占或者是執行完num+1,但是並未儲存到num中,此時的自增也是不成功的

上**:

import threading

import time

num =

100def

main()

: t1 = threading.thread(target=add1,args=

(1000000,)

) t2 = threading.thread(target=add2,args=

(1000000,)

) t1.start(

)#time.sleep(1)

t2.start(

)print

(f'-----main-----'

)def

add1

(nums)

:global num

for i in

range

(nums)

: num+=

1#time.sleep(1)

print

(f'-----add1----'

)def

add2

(nums)

:global num

for i in

range

(nums)

: num +=

1#time.sleep(1)

print

(f'-----add2----'

)if __name__ ==

'__main__'

: main(

)

當nums的值為100時結果:

-----add1----200

-----add2----300

-----main-----300

說明add1先執行結束,該值應用到了add2中和main中

當nums=10**5(10萬)時,結果:

-----add1----100100

-----main-----148375

-----add2----200100

當nums=10**6時

-----main-----146870

-----add1----1095957

-----add2----1269474

此時的值已經亂了,main先結束,兩個子執行緒的值互相干擾

執行緒的全域性變數

from threading import thread import time g num 100 defwork1 global g num for i in range 3 g num 1 print in work1,g num is d g num defwork2 global g nu...

7 多執行緒 全域性變數 共享全域性變數

多執行緒 全域性變數 共享全域性變數 多執行緒可以對全域性變數進行修改,修改後的結果會影響下乙個執行緒 程序不可以共享全域性變數,子程序是複製父程序的全域性變數,修改後互不影響 from threading import thread import time,random g num 100 def...

執行緒中全域性變數和成員變數

1 執行緒處理了全域性變數 package com.medivh.thread public class threadtest3 class first implements runnable catch interruptedexception e if 10 this.i 測試結果 first0...