死鎖
在線程間共享多個資源的時候?如果兩個線程分別占有一部分資源并且同時等待對方的資源,就會造成死鎖。
盡管死鎖很少發(fā)生,但一旦發(fā)生就會造成應(yīng)用的停止響應(yīng)。下面看一個死鎖的例子
避免死鎖
程序設(shè)計時盡量避免(比如:銀行家算法)
添加超時時間
死鎖的例子:
# 死鎖: 一直等待對方釋放鎖的情景叫做死鎖
import? threading
# 創(chuàng)建互斥鎖
lock = threading.Lock()
# 需求: 多線程同時根據(jù)下標(biāo)在列表中取值,要保證同一時刻只能有一個線程去取值
def? get_value(index):
????# 上鎖
????lock.acquire()
????my_list = [1,4,6]
????# 判斷下標(biāo)是否越界
????if? index >= len(my_list):
????????print("下標(biāo)越界:", index)
????????return
# 根據(jù)下標(biāo)取值
value = my_list[index]
print(value)
# 釋放鎖
lock.release()
if__name__=='__main__':
# 創(chuàng)建大量線程,同時執(zhí)行根據(jù)下標(biāo)取值的任務(wù)
????for i in range(10):
????????# 每循環(huán)一次創(chuàng)建一個子線程
????????sub_thread = threading.Thread(target=get_value, args=(i,))
????????# 啟動線程執(zhí)行任務(wù)
????????sub_thread.start()
上面程勛運行發(fā)生了死鎖,原因在于 return 執(zhí)行后,標(biāo)志著函數(shù)結(jié)束,但是鎖沒有被釋放,但是你又創(chuàng)建了10個線程,那后面的線程就會一直等待釋放鎖,從而造成死鎖,因此正確寫法如下:
# 死鎖: 一直等待對方釋放鎖的情景叫做死鎖
import? threading
# 創(chuàng)建互斥鎖
lock = threading.Lock()
# 需求: 多線程同時根據(jù)下標(biāo)在列表中取值,要保證同一時刻只能有一個線程去取值
def? get_value(index):
????# 上鎖
????lock.acquire()
????my_list = [1,4,6]
????# 判斷下標(biāo)是否越界
????if? index >= len(my_list):
????????print("下標(biāo)越界:", index)
????????# 取值不成功,也需要釋放互斥鎖,不要影響后面的線程去取值
????????# 鎖需要在合適的地方進(jìn)行釋放,防止死鎖
????????lock.release()
????????return
# 根據(jù)下標(biāo)取值
value = my_list[index]
print(value)
# 釋放鎖
lock.release()
if__name__=='__main__':
# 創(chuàng)建大量線程,同時執(zhí)行根據(jù)下標(biāo)取值的任務(wù)
????for i in range(10):
????????# 每循環(huán)一次創(chuàng)建一個子線程
????????sub_thread = threading.Thread(target=get_value, args=(i,))
????????# 啟動線程執(zhí)行任務(wù)
????????sub_thread.start()