死锁


'''
死锁:
    两把锁
    申请锁的顺序使用不当
开发过程中使用线程,在线程间共享多个资源的时候,
如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
尽管死锁很少发生,但一旦发生就会造成应用的停止响应,程序不做任何事情。

避免死锁:
1. 重构代码
2. 使用timeout参数
'''
import time
from threading import Lock, Thread, current_thread


def task1(lock1, lock2):
    if lock1.acquire():
        print('{}获取到lock1锁。。。。'.format(current_thread().name))
        for i in range(5):
            print('{}------------------>{}'.format(current_thread().name, i))
            time.sleep(0.01)
        if lock2.acquire(timeout=2):  # 阻塞
            print('{}获取了lock1,lock2'.format(current_thread().name))
            lock2.release()

        lock1.release()


def task2(lock1, lock2):
    if lock2.acquire():
        print('{}获取到lock2锁。。。。'.format(current_thread().name))
        for i in range(5):
            print('{}----->{}'.format(current_thread().name, i))
            time.sleep(0.01)
        if lock1.acquire(timeout=2):  # 阻塞
            print('{}获取了lock1,lock2'.format(current_thread().name))
            lock1.release()
        lock2.release()


if __name__ == '__main__':
    lock1 = Lock()  # 锁1
    lock2 = Lock()  # 锁2

    t1 = Thread(target=task1, args=(lock1, lock2))
    t2 = Thread(target=task2, args=(lock1, lock2))

    t1.start()
    t2.start()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值