python多執行緒死鎖及解決方案

2021-09-18 01:54:33 字數 1865 閱讀 9744

所謂死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序

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

產生死鎖的**:

import threading

import time

def test1():

ma.acquire()

print("test1--上鎖a")

time.sleep(1)

mb.acquire()

print("test1---上鎖b")

ma.release()

print("test1---解鎖a")

mb.release()

print("test1---解鎖b")

def test2():

mb.acquire()

print("test2---上鎖b")

time.sleep(1)

ma.acquire()

print("test2--上鎖a")

mb.release()

print("test2---解鎖b")

ma.release()

print("test2---解鎖a")

ma = threading.lock()

mb = threading.lock()

def main():

t1 = threading.thread(target=test1)

t2 = threading.thread(target=test2)

t1.start()

t2.start()

if __name__ == '__main__':

main()

執行結果:

print("test1--上鎖a")

time.sleep(1)

mb.acquire(timeout=3) # 在此處新增了超時時間,此處上鎖超過3秒自動解鎖

print("test1---上鎖b")

ma.release()

print("test1---解鎖a")

# mb.release() 因為是死鎖,所有在上面**一定會達到超時時間自動解鎖,執行到此處時會報錯 (release unlocked lock)無法解鎖已經解開的鎖,要注釋掉

print("test1---解鎖b")

def test2():

mb.acquire()

print("test2---上鎖b")

time.sleep(1)

ma.acquire()

print("test2--上鎖a")

mb.release()

print("test2---解鎖b")

ma.release()

print("test2---解鎖a")

執行結果:

test1--上鎖a

test2---上鎖b

test1---上鎖b

test1---解鎖a

test1---解鎖b

test2--上鎖a

test2---解鎖b

test2---解鎖a

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...

GDB除錯多執行緒及死鎖

參考文章 我在這裡總結一下 檢視正在執行的所有執行緒info threads 切換到指定執行緒thread id 這裡的id是info threads後各執行緒前面的序號 break thread test.c 123 thread all 在所有執行緒中相應的行上設定斷點 除錯死鎖流程 開啟cor...

多執行緒死鎖

這段時間剛好學到多執行緒,下面是自己對死鎖的一些感悟,並不是我說的有多到位,只是想到一種更為通俗易懂理解方式,現在和大家一起分享一下,有改進的地方,希望大家多提提意見。一 首先說一下死鎖的定義 由兩個或兩個以上的執行緒由於互相競爭資源,導致一種互相等待的狀態,如果沒有外力推動,則他們都無法進行下去。...