python 互斥鎖與死鎖

2021-10-02 18:35:02 字數 2986 閱讀 6936

一.概念原理

當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制

執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。

互斥鎖為資源引入乙個狀態:鎖定/非鎖定。

某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「非鎖定」,其他的執行緒才能再次鎖定該資源。互斥鎖保證了每次只有乙個執行緒進行寫入操作,從而保證了多執行緒情況下資料的正確性。

二.示例

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

("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

work2-

->

2000000

main-

->

2000000

其中,

鎖定方法acquire可以有乙個引數。

如果引數設定為true,則當前執行緒會堵塞,直到獲取到這個鎖為止(如果沒有指定,那麼預設為true)

如果設定引數為false,則當前執行緒不會堵塞

鎖的好處:

確保了某段關鍵**只能由乙個執行緒從頭到尾完整地執行

鎖的壞處:

阻止了多執行緒併發執行,包含鎖的某段**實際上只能以單執行緒模式執行,效率就大大地下降了

由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖

一.概念

在多道程式系統中,由於多個程序的併發執行,改善了系統資源的利用率並提高了系統的處理能力。

然而,多個程序的併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個程序因競爭資源而造成的一種僵局,若無外力作用,這些程序都將無法向前推進。

二.示例

lock1 = lock(

)lock2 = lock(

)def

work1

(num)

: lock1.acquire(

)#lock1上鎖

time.sleep(1)

print

("in work1"

) lock2.acquire(

)# lock2上鎖

print

("work1-----"

) lock2.release(

)#lock2解鎖

lock1.release(

)#lock1解鎖

defwork2

(num)

: lock2.acquire(

)#lock2加鎖

print

("in work2"

) lock1.acquire(

)#lock1加鎖

print

("work1-----"

) lock1.release(

)#lock1解鎖

lock2.release(

)#lock2解鎖

if __name__ ==

'__main__'

: t1 = thread(target=work1,args=

(1000000,)

) t2 = thread(target=work2, args=

(1000000,)

) t1.start(

) t2.start(

)

結果:

in work2

in work1

看了上面的例子我們來說說防止死鎖的加鎖機制

問題:你正在寫乙個多執行緒程式,其中執行緒需要一次獲取多個鎖,此時如何避免死鎖問題。

解決方案:

在多執行緒程式中,死鎖問題很大一部分是由於執行緒同時獲取多個鎖造成的。舉個例子:乙個執行緒獲取了第乙個鎖,然後在獲取第二個鎖的 時候發生阻塞,那麼這個執行緒就可能阻塞其他執行緒的執行,從而導致整個程式假死。 解決死鎖問題的一種方案是為程式中的每乙個鎖分配乙個唯一的id,然後只允許按照公升序規則來使用多個鎖。

python 互斥鎖,死鎖

同步與非同步之間的區別 1.同步 可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結 果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。2.非同步 非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣...

Python互斥鎖 死鎖

死鎖當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制。執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀...

python 互斥鎖 死鎖

在多執行緒下,全域性變數是共享的,但是在兩個執行緒同時使用乙個全域性變數時,會出現這麼乙個情況,當a讀取了全域性變數a,b也讀取全域性變數a,a對a進行了 1操作,但是b是讀取a沒有進行一次 1操作之前的資料,然後b也進行 1操作,這就導致這錯誤的出現。為了防止這個錯誤的出現,所以引進互斥鎖。使用鎖...