共享全域性變數的資源競爭

2021-10-04 19:09:57 字數 1501 閱讀 6055

共享全域性變數的資源競爭

import threading

import time

num =

0def

demo1

(nums)

:global num

for i in

range

(nums)

: num +=

1print

("demo1---num:%d"

% num)

defdemo2

(nums)

:global num

for i in

range

(nums)

: num +=

1print

("demo2---num:%d"

% num)

defmain()

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

(100,)

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

(100,)

) t1.start(

) t2.start(

)print

("main---num:%d"

% num)

執行結果:

調整引數值:

def

main()

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

(100000,)

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

(100000,)

)

執行結果:

為什麼值變大以後,執行結果不正確?

demo1子執行緒中:

for i in range(nums)

num += 1

執行以上**時:

1.獲取num的值

2.把獲取到的num +1

3.把2步的結果儲存到num中

demo2子執行緒同上

demo1與demo2在cpu中執行,cpu 以時間片輪轉方式執行

檢視位元組碼驗證:

phthon位元組碼 - > python虛擬機器來執行python位元組碼

import dis

def add_num(a):

a+=1

print(dis.dis(add_num))

load a

load 1

執行add

賦值給a

如何解決?可用互斥鎖

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

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

MFC共享全域性變數

去網上找資料 看到一條 自己定義乙個.h檔案,然後把所有的全域性變數放在其中,在每個使用變數的檔案中include 好像一般都是這麼做的,尤其是一些比較大的工程,這樣在加其他的全程變數是很方便 但是 去測試的時候一直報錯 error lnk2005 int snumofstudent snumofs...

swoole的全域性變數共享範圍

在事件onstart onworkstart之前定義的全域性變數是共享的,之後的事件因為多程序的原因並不保證可共享。但不一定共享全域性變數就好,比如mysql或redis就不適合共用乙個連線。websocket的全域性變數共享 socket的事件是共享的,但onrequest事件不共享。絕對不可以。...