線程 -- 死鎖

死鎖

在線程間共享多個資源的時候?如果兩個線程分別占有一部分資源并且同時等待對方的資源,就會造成死鎖。

盡管死鎖很少發(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 線程概述 多線程類似于同時執(zhí)行多個不同程序,多線程運行有如下優(yōu)點: 使用線程可以把占據(jù)長時間的程序中的任務(wù)放到后臺...
    rookieyu閱讀 422評論 0 1
  • 一、死鎖的定義 多線程以及多進(jìn)程[http://www.itdecent.cn/p/94b7c2ab84ac]改...
    Djbfifjd閱讀 931評論 0 5
  • 姓名:郭金 學(xué)號:17101223407 【嵌牛導(dǎo)讀】:之前看到一個用jstack查看死鎖的例子??偨Y(jié)了一下:js...
    寶寶啦啦啦閱讀 971評論 0 0
  • 死鎖概念 所謂的死鎖指的是多個線程之間因為競爭同一系統(tǒng)資源從而造成的一種僵局(互相等待)現(xiàn)象。此時若無外力作用,這...
    阮小貳閱讀 2,093評論 1 5
  • 什么是死鎖 1,多線程以及多進(jìn)程改善了系統(tǒng)資源的利用率并提高了系統(tǒng)的處理能力。然而,并發(fā)執(zhí)行也帶來了新的問題--死...
    trues閱讀 568評論 0 1

友情鏈接更多精彩內(nèi)容