0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

两个线程,两个互斥锁如何形成死锁

strongerHuang 来源:strongerHuang 作者:一口Linux 2020-12-28 09:24 次阅读

两个线程,两个互斥锁如何形成死锁?

程序流程图如下:

c1122ad4-46d6-11eb-8b86-12bb97331649.png

程序流程图

如上图所示:

t0时刻,主线程创建子线程,并初始化互斥锁mutex1、mutex2;

t1时刻,主线程申请到了mutex1、子线程申请到了mutex2;

t2时刻,主线程和子线程都sleep 1秒钟,防止优先获得时间片的线程直接申请到了另外1个互斥锁,导致程序直接退出;

t3时刻,主线程和子线程都想获得对方手里的互斥锁,但是对方都来不及释放自己手里的锁;

t4时刻,主线程和子线双双进入休眠。

【注意】为了保证主线程和子线程都能够分别获得锁mutex1、mutex2,各自获得锁后一定要先sleep 1秒钟,否则创建完子线程后,主线程还有一定的时间片,主线程会申请到锁mutex2,无法形成死锁。

死锁

源码如下

o4YBAF_pNF-AMP79AABcucKRsVw255.jpg

pIYBAF_pNGaAFWMGAACMZONs3TM009.jpg

pIYBAF_pNGyAUgCQAABZTHs3PoA856.jpg

编译运行

从执行结果可以判断,主线程和子线程分别获得了互斥锁mutex1、mutex2,sleep 1秒后,他们都想再分别申请mutex2、mutex1,而双方都不想释放自己手中的锁,锁已形成了死锁,程序就一直处于休眠状态。

查看下该进程的线程

查看进程ID,为4204

查看该进程创建的线程id:4204、4205。

责任编辑:xj

原文标题:两个线程,两个互斥锁,怎么形成一个死循环?

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 死锁
    +关注

    关注

    0

    文章

    25

    浏览量

    8051
  • 线程
    +关注

    关注

    0

    文章

    497

    浏览量

    19545

原文标题:两个线程,两个互斥锁,怎么形成一个死循环?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问ad9171的两个输出端口是否支持同时输出两个不同的频率?

    你好,关于AD9171芯片我有一问题 ,数据手册显示该芯片具有两个输出通道,芯片内部有DAC0和DAC1共两个DAC通道,那么这两个通道是否支持同时输出
    发表于 05-28 06:20

    怎么让工程中同时存在两个ioc文件?

    你好,我现在需要在一工程中兼容两个不同的项目,这两个项目有不同的配置文件,请问可否让两个ioc文件同时存在,通过修改路径之类的方法来使需要的ioc文件生效?
    发表于 05-23 07:50

    STM32MP157两个A7核能跑两个系统吗?

    请问STM32MP157的两个A7核,能像其它双核CPU一样运行AMP模式:一核跑Linux、一核跑RTOS(或禅机)吗?虽然有一M4核可以跑RTOS,但计算能力有点弱,不能满足
    发表于 03-21 06:50

    stm32h750如何使用两个usb口?

    我现在在使用stm32h750芯片,想要使用两个usb口,一作为device连接电脑,一作为host连接u盘。spi之类的都有需要spi1 spi2这种,但是并不明白我这个usb怎么做,好像
    发表于 02-26 06:51

    想用TC275控制两个永磁电机,GPT12能不能实现两个QEP功能?

    想用TC275控制两个永磁电机,不知道GPT12能不能实现两个QEP功能,供路电机使用
    发表于 02-05 07:14

    ADXRS453能同时检测两个方向吗?

    ADXRS453的介绍中说可以检测两个方向X或Y,但是手册中只提供了一套速率寄存器RATE0和RATE1,只能用于一方向。我的问题是ADXRS453能否同时检测两个方向的速率?如何读取这两个
    发表于 12-29 06:30

    AD9269在AD两个通道的入口输入峰值相同的差分信号,为什么AD两个通道的输出不同?

    在AD两个通道的入口输入峰值相同的差分信号,为什么AD两个通道的输出不同,最高位的符号位为什么不同
    发表于 12-12 06:55

    java死锁产生的条件

    了解死锁产生的条件。 互斥条件(Mutual Exclusion):一个资源每次只能由一个线程使用。这是引发死锁的最基本条件。当一个线程占有
    的头像 发表于 12-04 13:42 265次阅读

    死锁的现象以及原理

    前言 本文将从0到1写一个死锁检测组件。源码:deadlock_success.c 组件如何放入自己的项目里?把代码末两个Debug部分删除,在你的项目里添加下面两句代码即可使用死锁检测组件
    的头像 发表于 11-13 16:30 360次阅读
    <b class='flag-5'>死锁</b>的现象以及原理

    死锁的现象及原理

    组件如何放入自己的项目里?把代码末两个Debug部分删除,在你的项目里添加下面两句代码即可使用死锁检测组件。 init_hook (); start_check (); 1. 死锁的现象以及
    的头像 发表于 11-10 16:32 299次阅读
    <b class='flag-5'>死锁</b>的现象及原理

    通过两个不同的定时器控制PWM的输出,如何让者同步?

    通过两个不同的定时器控制PWM的输出,希望两个PWM可以同步,该如何处理?
    发表于 11-06 06:47

    如何判别两个信号波形的相似度?

    获得两个波形,即组数据,如何判别它们之间的相似度呢
    发表于 10-18 06:49

    STM32可以实现两个串口同时收发数据吗?

    两个串口同时收发数据可以做到吗
    发表于 10-15 09:44

    SG6服务器有两个网卡,但是有一电口和两个光口具体应该怎么连接?

    SG6服务器有两个网卡,但是有一电口和两个光口,具体应该怎么连接
    发表于 09-19 07:25

    使用NUC472的两个USB与PC连接

    应用程序: 本代码使用两个 USB 接口执行 USB 中心 。 BSP 版本: NUC472系列 BSP CMSIS V3.03.000 硬件: Nu-LB-NUC472 本示例代码
    发表于 08-22 08:30