Python 多執行緒中死鎖了怎麼辦?

2022-09-03 15:51:14 字數 2662 閱讀 4895

就好像在現實社會中,男女雙方在鬧彆扭之後,都在等待對方先道歉。

如果雙方都這樣固執地等待對方先開口,弄不好,就 over 了。

儘管死鎖很少發生,但一旦發生就會造成應用的停止響應。

下面看乙個死鎖的例子:

import threading

import time

class mythread1(threading.thread):

def run(self):

# 對mutexa上鎖

mutexa.acquire()

# mutexa上鎖後,延時1秒,等待另外那個執行緒 把mutexb上鎖

print(self.name+'----do1---up----')

time.sleep(1)

# 此時會堵塞,因為這個mutexb已經被另外的執行緒搶先上鎖了

mutexb.acquire()

print(self.name+'----do1---down----')

mutexb.release()

# 對mutexa解鎖

mutexa.release()

class mythread2(threading.thread):

def run(self):

# 對mutexb上鎖

mutexb.acquire()

# mutexb上鎖後,延時1秒,等待另外那個執行緒 把mutexa上鎖

print(self.name+'----do2---up----')

time.sleep(1)

# 此時會堵塞,因為這個mutexa已經被另外的執行緒搶先上鎖了

mutexa.acquire()

print(self.name+'----do2---down----')

mutexa.release()

# 對mutexb解鎖

mutexb.release()

mutexa = threading.lock()

mutexb = threading.lock()

if __name__ == '__main__':

t1 = mythread1()

t2 = mythread2()

t1.start()

t2.start()

執行結果:多執行緒

ps d:\project> & d:/python/python.exe d:/project/xiancheng8.py

thread-1----do1---up----

thread-2----do2---up----

程式會卡死,執行到前面幾行**,就不往下執行了。

避免死鎖有好幾種方式,這裡我們簡單介紹下。

銀行家演算法

[背景知識]

乙個銀行家如何將一定數目的資金安全地借給若干個客戶,使這些客戶既能借到錢完成要幹的事,同時銀行家又能收回全部資金而不至於破產,這就是銀行家問題。

這個問題同作業系統中資源分配問題十分相似:銀行家就像乙個作業系統,客戶就像執行的程序,銀行家的資金就是系統的資源。

[問題的描述]

乙個銀行家擁有一定數量的資金,有若干個客戶要貸款。

每個客戶須在一開始就宣告他所需貸款的總額。若該客戶貸款總額不超過銀行家的資金總數,銀行家可以接受客戶的要求。

客戶貸款是以每次乙個資金單位的方式進行的,客戶在借滿所需的全部單位款額之前可能會等待,但銀行家須保證這種等待是有限的,可完成的。

例如:有三個客戶c1,c2,c3,向銀行家借款,該銀行家的資金總額為10個資金單位,其中c1客戶要借9個資金單位,c2客戶要借3個資金單位,c3客戶要借8個資金單位,總計20個資金單位。

某一時刻的狀態如圖所示。

對於a圖的狀態,按照安全序列的要求,我們選的第乙個客戶應滿足該客戶所需的貸款小於等於銀行家當前所剩餘的錢款,可以看出只有c2客戶能被滿足。

c2客戶需1個資金單位,小銀行家手中的2個資金單位,於是銀行家把1個資金單位借給c2客戶,使之完成工作並歸還所借的3個資金單位的錢。

進入b圖。

同理,銀行家把4個資金單位借給c3客戶,使其完成工作,在c圖中,只剩乙個客戶c1,它需7個資金單位,這時銀行家有8個資金單位,所以c1也能順利借到錢並完成工作。

最後(進入圖d)銀行家收回全部10個資金單位,保證不賠本。

那麼客戶序列就是個安全序列,按照這個序列貸款,銀行家才是安全的。

否則的話,若在圖b狀態時,銀行家把手中的4個資金單位借給了c1,則出現不安全狀態:這時c1,c3均不能完成工作,而銀行家手中又沒有錢了,系統陷入僵持局面,銀行家也不能收回投資。

綜上所述

銀行家演算法是從當前狀態出發,逐個按安全序列檢查各客戶誰能完成其工作,然後假定其完成工作且歸還全部貸款,再進而檢查下乙個能完成工作的客戶,......。

如果所有客戶都能完成工作,則找到乙個安全序列,銀行家才是安全的。

Python 多執行緒4 死鎖

encoding utf 8 import threading import time class mythread threading.thread def do1 self global resa,resb if mutexa.acquire msg self.name got resa pri...

什麼是多執行緒,鎖,死鎖,怎麼避免死鎖

面試官問執行緒的問題,以前從來沒有總結過怎麼回答,一下子就說不出來了。回來細細總結一下,下次不能再不知道從 說起了 細思之,首先應該 了解什麼是執行緒 執行緒是資源分配的基本單位,程式執行流的最小單位。執行緒可以共用記憶體資源,多執行緒能解決cpu空閒的問題。多執行緒能夠實現併發的執行任務,提高處理...

多執行緒中的死鎖

一 死鎖 所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局 互相等待 若無外力作用,這些程序都無法向前推進。二 如何避免死鎖 1 加鎖順序 執行緒按照一定的順序加鎖 本例就是採用這種方法 2 加鎖時限 執行緒嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己占有的鎖 例如本例中的...