宣告乙個全域性變數,當我們修改全域性變數中的內容時,其他執行緒也會收到相應的修改。
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...