• 死锁的常见例子及 Python 模拟


     

    前言

    常见的例子是在银行账户上:假如要在两个银行账户之间执行交易,你必须确保两个账户都被锁定,不受其他交易的影响,以达到正确的资金转移量。在这里,这个类比并不完全成立--哲学家对应的是锁定账户的交易(分叉)--但同样的技术困难也会出现。

    其他的例子包括电商秒杀系统,多个用户抢一个商品,不允许一个数据库被多个客户同时修改。

    死锁也是由一个并发程序需要同时具备的条件来定义的,这样才会发生死锁。这些条件是由计算机科学家Edward G. Coffman, Jr .首先提出的,因此被称为 Coffman 条件。这些条件如下:

    • 至少有一个资源必须处于不可共享的状态。这意味着该资源被一个单独的进程(或线程)持有,不能被其他人访问; 在任何时间内,该资源只能被单个的进程(或线程)访问和持有。这个条件也被称为相互排斥
    • 有一个进程(或线程)同时访问一个资源并等待其他进程(或线程)持有的另一个资源。换句话说,这个进程(或线程)需要访问两个资源来执行其指令,其中一个它已经持有,另一个它正在等待其他进程(或线程)。这种情况被称为保持和等待
    • 只有在有特定指令让进程(或线程)释放资源的情况下,才能由持有这些资源的进程(或线程)来释放。这就是说,除非进程(或线程)自愿主动地释放资源,否则该资源仍处于不可共享的状态。这就是无抢占条件
    • 最后一个条件叫做循环等待。顾名思义,这个条件规定了一组进程(或线程)的存在,因此这组进程中的第一个进程(或线程)正在等待第二个进程(或线程)释放资源,而第二个进程(或线程)又需要等待第三个进程(或线程);最后,这组进程中的最后一个进程(或线程)正在等待第一个进程。

    造成线程死锁的常见例子包括:

    1. 一个在自己身上等待的线程(例如,试图两次获得同一个互斥锁)
    2. 互相等待的线程(例如,A 等待 B,B 等待 A)
    3. 未能释放资源的线程(例如,互斥锁、信号量、屏障、条件、事件等)
    4. 线程以不同的顺序获取互斥锁(例如,未能执行锁排序)

    模拟死锁1:线程等待本身

    导致死锁的一个常见原因是线程在自己身上等待。

    我们并不打算让这种死锁发生

  • 相关阅读:
    【C++游戏引擎Easy2D】基于Node节点展开的Text文本拓展详解
    美食杰项目(六)发布菜谱
    7个在Github上的flutter开源程序
    解决卸载node升级到node12版本后踩坑sass-loader和node-sass版本冲突的问题
    docker openjdk:8-jdk-alpine 修改时区、添加字体
    操作系统之《PV操作》【知识点+详细解题过程】
    bash: mysqlbinlog: command not found (mysqlbinlog:命令不存在)
    无线安全操作(2)
    javascript二维数组按指定要求进行对象合并遍历的算法开发(2):计算数组中某元素出现的次数
    leetcode简单题25 N.112 路径总和 rust描述
  • 原文地址:https://blog.csdn.net/wadfdhsajd/article/details/126785148