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()

 

posted on 2022-05-12 12:43  墙角一枝花  阅读(84)  评论(0编辑  收藏  举报