一、死鎖
在執行緒間共享多個資源的時候,如果兩個執行緒分別占有一部分資源并且同時等待對方的資源,就會造成死鎖,
就好像在現實社會中,男女雙方在鬧別扭之后,都在等待對方先道歉,
如果雙方都這樣固執地等待對方先開口,弄不好,就 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個資金單位,保證不賠本,
那麼客戶序列{C1,C2,C3}就是個安全序列,按照這個序列貸款,銀行家才是安全的,
否則的話,若在圖b狀態時,銀行家把手中的4個資金單位借給了C1,則出現不安全狀態:這時C1,C3均不能完成作業,而銀行家手中又沒有錢了,系統陷入僵持局面,銀行家也不能識訓投資,
綜上所述
銀行家演算法是從當前狀態出發,逐個按安全序列檢查各客戶誰能完成其作業,然后假定其完成作業且歸還全部貸款,再進而檢查下一個能完成作業的客戶,......,
如果所有客戶都能完成作業,則找到一個安全序列,銀行家才是安全的,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137854.html
標籤:Python
