1. 程式人生 > 其它 >python-死鎖和遞迴鎖(可重複鎖)

python-死鎖和遞迴鎖(可重複鎖)

一、什麼是死鎖

【1】兩個執行緒同時佔有某個資源,並且同時等待對方的資源,就會造成死鎖

# -*- coding:utf-8 -*-
# __author__:
# 2022/5/12
import threading,time
#A向B要錢,B向A要貨物,A要讓B先給,B讓A先給,兩者造成死鎖

# 建立鎖A
lockA = threading.Lock()
# 建立鎖B
lockB = threading.Lock()

def A():
    # 鎖住
    lockA.acquire()
    print('先給我錢')
    time.sleep(1)

    # 部分資源被B鎖住
    lockB.acquire()
    print('先給我貨物')
    time.sleep(1)

    # 解鎖
    lockB.release()
    lockA.release()

def B():
    # 鎖住
    lockB.acquire()
    print('先給我貨物')
    time.sleep(1)

    #A佔有部分資源
    # 部分資源被B鎖住
    lockA.acquire()
    print('先給我錢')
    time.sleep(1)

# 建立兩個執行緒
t1 = threading.Thread(target=A)
t2 = threading.Thread(target=B)

# 啟動執行緒
t1.start()
t2.start()

# 輸出:
# 先給我錢
# 先給我貨物

【2】遞迴鎖:內建lock和count

# 遞迴鎖內有lock和count計數器,上鎖1次count+1,解鎖1次count-1,count必須>=0
# 遞迴鎖在一定程度上安全性比同步鎖要低,所以一般在讀的時候用遞迴鎖,寫的時候用同步鎖,提升效率

# -*- coding:utf-8 -*-
# __author__:pansy
# 2022/5/12
# 遞迴鎖內有lock和count計數器,上鎖1次count+1,解鎖1次count-1,count必須>=0
# 遞迴鎖在一定程度上安全性比同步鎖要低,所以一般在讀的時候用遞迴鎖,寫的時候用同步鎖,提升效率

# 建立遞迴鎖
import threading,time

rLock = threading.RLock()

def A():
    # 鎖住
    rLock.acquire() # count+1
    print('先給我錢')
    time.sleep(1)

    # 部分資源被B鎖住
    rLock.acquire() # count+1
    print('先給我貨物')
    time.sleep(1)

    # 解鎖
    rLock.release() # count-1
    rLock.release() # count-1

def B():
    # 鎖住
    rLock.acquire()
    print('先給我貨物')
    time.sleep(1)

    #A佔有部分資源
    # 部分資源被B鎖住
    rLock.acquire()
    print('先給我錢')
    time.sleep(1)

# 建立兩個執行緒
t1 = threading.Thread(target=A)
t2 = threading.Thread(target=B)

# 啟動執行緒
t1.start()
t2.start()