死锁及其处理

什么是死锁:

死锁指的是由于两个或者两个以上的线程在执行的过程中,由于竞争资源或者由于彼此通信而造成的阻塞现象,若无外力处理,他们将无法继续进行下去。

死锁发生的必要条件:

  1. 互斥条件:在线程中资源的使用具有排他性。
  2. 请求和保护条件:自己的资源不愿意放出去,别人的资源拿不进来。
  3. 不剥夺条件:自己的资源,不适用前也不能被别的线程使用,知道自己使用完成后自动释放出去别的线程才能使用。
  4. 环路等待条件:环形等待,(想想三角恋关系就能理解了!)

死锁产生的原因:
从上面的四个必要条件,我们可以总结出产生的原因有:

  1. 一个线程占有别的线程所需要的资源;
  2. 都不想放弃自己拥有的资源。

如何避免死锁:破坏四个必要条件就ok了!

死锁代码演示:

"""
死锁情形模拟
"""
from threading import Thread,Lock
from time import sleep

# 账户类
class Account:
    def __init__(self,_id,balance,lock):
        self.id = _id  # id
        self.balance = balance  # 存款
        self.lock = lock # 维护锁

    # 取钱
    def withdraw(self,amount):
        self.balance -= amount
    # 存钱
    def deposit(self,amount):
        self.balance += amount
    # 查看余额
    def get_balance(self):
        return self.balance

# 生成两个账户
Tom = Account('Tom',12000,Lock())
Abby = Account('Abby',9000,Lock())

# 转账  账户金额变动需要先上锁
def transfer(from_,to,amount):
    if from_.lock.acquire():
        from_.withdraw(amount) # from_账户钱减少
        sleep(0.1)
        if to.lock.acquire():
            to.deposit(amount) # to 存钱
            to.lock.release()
        from_.lock.release()
    print("%s给%s转了%d元"%(from_.id,to.id,amount))

t1 = Thread(target=transfer,args=(Tom,Abby,4000))
t2 = Thread(target=transfer,args=(Abby,Tom,1500))
t1.start()
t2.start()
t1.join()
t2.join()
print("Tom:",Tom.get_balance())
print("Abby:",Abby.get_balance())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值