共享執行緒資源導致的資料不安全與解決之python

2021-10-02 18:43:21 字數 2543 閱讀 2229

from threading import thread

import time

g_num=

0def

work1

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

("in work1-->"

,g_num)

defwork2

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

("in work2-->"

,g_num)

defmain()

: t1 = thread(target=work1,args=

(1000000,)

) t2 = thread(target=work2,args=

(1000000,)

) t1.start(

) t2.start(

)'''

執行結果:

in work1--> 1111286

in work2--> 1196255

sum-->> 1196255

'''

分析:t1執行緒對g_num進行一百萬次加一,t2執行緒對g_num進行一百萬次加一,我們預期最後的結果應該是二百萬。但是看到執行的結果卻不是我們預期的值,這是為什麼了?

:這是因為g_num += 1在執行的時候會解析成,先獲取g_num的值,再進行加一,最後才是儲存到g_num中。那麼我們可以模擬一下cpu執行。

可能會出現以下的錯誤情況!

答:當work1先獲取g_num的值等於0,排程系統將work1調為睡眠,切換到work2,先獲取g_num的值也等於0,於是進行加一,g_num變為1,work2又睡眠,切換到work1,進行增一,但是這時候是0+1變為1。而再切換到work2,獲取卻是1了,將之前值覆蓋,導致最後的結果不足預期的結果,這就是主要原因。

那麼了解了問題所在,那有什麼辦法解決呢?

什麼是互斥鎖

當多個執行緒幾乎同時修改乙個共享資料的時候,需要進行同步控制,執行緒同步能夠保證多個 執行緒安全的訪問競爭資源(全域性內容),最簡單的同步機制就是使用互斥鎖。 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為鎖定狀態,其他執行緒就不能更 改,直到該執行緒將資源狀態改為非鎖定狀態,也就是釋放資源,其他的執行緒才能再次鎖定資 源。互斥鎖保證了每一次只有乙個執行緒進入寫入操作。從而保證了多執行緒下資料的安全性。

**示例

from threading import thread

from threading import lock

g_num=

0#建立乙個全域性鎖物件』

lock=lock(

)def

work1

(num)

:global g_num

lock.acquire(

)#加鎖

for i in

range

(num)

: g_num+=

1#解鎖

lock.release(

)print

("in work1-->"

,g_num)

defwork2

(num)

:global g_num

lock.acquire(

)#加鎖

for i in

range

(num)

: g_num+=

1#解鎖

lock.release(

)print

("in work2-->"

,g_num)

defmain()

: t1 = thread(target=work1,args=

(1000000,)

) t2 = thread(target=work2,args=

(1000000,)

) t1.start(

) t2.start(

) t2.join(

)if __name__ ==

'__main__'

: main(

)print

("main--》"

, g_num)

'''執行結果:

in work1--> 1000000

in work2--> 2000000

main--》 2000000

'''

總結:通過使用互斥鎖解決共享執行緒資源不安全的問題的實質就是當執行緒操作資源的時候,將資源鎖住,操作結束後,解鎖。

執行緒安全與不安全

list介面下面有兩個實現 乙個是arraylist 另外乙個是vector 從原始碼的角度來看 vector的方法前加了,synchronized 關鍵字,也就是同步的意思,sun公司希望vector是執行緒安全的,而希望arraylist是高效的,缺點就是另外的優點。在 items size 的...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...