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

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

3天内不再提示

两个线程和互斥锁如何形成死循环?

璟琰乀 来源:一口Linux 作者:一口Linux 2021-01-02 16:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

两个线程,两个互斥锁如何形成死锁?程序流程图如下:

UF7nYf.png

程序流程图

如上图所示:

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

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

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

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

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

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

死锁

源码如下#include 《stdio.h》#include 《stdlib.h》#include 《string.h》#include 《pthread.h》 unsigned int value1, value2, count;pthread_mutex_t mutex1,mutex2;void *function(void *arg);void *function(void *arg){ pthread_mutex_lock(&mutex2); printf(“new thread get mutex2 ”); sleep(1); pthread_mutex_lock(&mutex1); printf(“new thread get mutex1 ”); pthread_mutex_unlock(&mutex1); printf(“new thread release mutex1 ”); pthread_mutex_unlock(&mutex2); printf(“new thread release mutex2 ”); return NULL; } int main(int argc, char *argv[]){ pthread_t a_thread; if (pthread_mutex_init(&mutex1, NULL) 《 0) { perror(“fail to mutex_init”); exit(-1); } if (pthread_mutex_init(&mutex2, NULL) 《 0) { perror(“fail to mutex_init”); exit(-1); } if (pthread_create(&a_thread, NULL, function, NULL) 《 0) { perror(“fail to pthread_create”); exit(-1); } while ( 1 ) { pthread_mutex_lock(&mutex1); printf(“main thread get mutex1 ”); sleep(1); pthread_mutex_lock(&mutex2); printf(“main thread get mutex2 ”); pthread_mutex_unlock(&mutex2); printf(“main thread release mutex2 ”); pthread_mutex_unlock(&mutex1); printf(“main thread release mutex1 ”); } return 0; }

编译运行

Q7reqy.png

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

查看下该进程的线程查看进程ID,为4204

qaYFb2.png

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

MZJJb2.png

责任编辑:haq

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

    关注

    90

    文章

    3708

    浏览量

    96778
  • 线程
    +关注

    关注

    0

    文章

    508

    浏览量

    20761
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    线程的系统

    ,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程。 每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后
    发表于 12-08 07:55

    飞凌嵌入式ElfBoard-文件I/O的了解探究之竞争冒险

    典型的竞争冒险示例,因为10线程之间的执行时序不确定,导致程序的行为不一致,假设两个线程几近于同时执行,他们获得的count旧值都是0,各自+1之后,count的新值就是1。为了避免
    发表于 11-26 15:38

    rtt中建两个线程a和b,怎么确保线程a执行完立刻切到线程b?

    怎么获取从线程开始切换到切换完成用的总的CPU时钟节拍数量?
    发表于 10-10 06:37

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?

    硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash,有一norf
    发表于 09-26 06:18

    使用lv_label_set_text释放内存没对齐是什么原因导致的?

    (guider_ui.monitor_label_pressure_now, "1"); rt_mutex_release(lv_mutex); // 释放互斥 使用lv_label_set_text导致释放内存没对齐是什么问题 已经加了
    发表于 09-16 06:44

    rt-thread-master内新修改dev_serial_v2.c后导致finsh线程循环无调度怎么解决?

    finsh线程死循环无调度,继而导致无法进入空闲线程,导致看门狗复位。 从两个截图中发现,减少了rt_wqueue_wait(&(device-&gt
    发表于 09-10 06:56

    官网nrf24l01的例程demo会出现互斥报错是为什么?

    我在用nrf24L01官网下载的例程包,用stm32进行开发,串口助手显示互斥错误,有朋友遇到这个问题吗
    发表于 09-10 06:05

    基本半导体连获两个行业奖项

    近日,基本半导体凭借在碳化硅模块领域的突出表现,连获“国产SiC模块TOP企业奖”和“年度优秀功率器件产品奖”两个行业奖项。
    的头像 发表于 09-05 16:31 902次阅读

    看到STM8L152用两个IO用两个或非门检测两个通断,是什么原理呢?

    图中两个按键开关是两个干簧管,为什么不直接对GND设计来检测这个干簧管通断呢? 这样设计的原理是什么?
    发表于 06-12 06:25

    移植最新版的rt-thread nano时发现程序只要一进去entry函数就直接跳到一死循环里,为什么?

    我在移植最新版的rt-thread nano时发现程序只要一进去entry函数就直接跳到一死循环里,我使用的编译器是armgcc10.2版本。然而我移植旧版的rt-thread nano就可以正常使用。
    发表于 04-01 07:04

    stm32f103定时器2配置中断,程序一直死循环,无法进入中断,怎么解决?

    目前定时器2配置中断,程序一直死循环,无法进入中断,有无大佬请教或者看一下参考历程
    发表于 03-12 08:18

    两个不同频率晶振靠的近会怎样

    晶振的振荡本质上是一种机械振动(在压电晶体层面)。当两个晶振靠得很近时,它们的机械振动可能会相互影响。一晶振的振动可能会通过电路板或者外壳等介质传递给另一晶振,从而改变另一晶振的
    的头像 发表于 01-20 13:55 2023次阅读
    <b class='flag-5'>两个</b>不同频率晶振靠的近会怎样

    将ADS1256设置为四路循环采样时遇到的两个疑问求解

    上说的方法)发现两个问题: 1、当只有一路给输入信号时,例如5mv,该路可以准确测量到输入值,但是当同时在另外一路再加上一路不同的输入时例如11mv,则所有路数采样得到数值都发生了改变,想知道这是
    发表于 01-10 08:38

    TLV320AIC3106有MIC3R MIC3L两个引脚,能不能用这两个引脚单独各接一路MIC输入,从而形成路MIC输入?

    大家好,TLV320AIC3106有MIC3R MIC3L两个引脚,我看EVM上做MIC输入时这两个引脚接在一起用,我想问,能不能用这两个引脚单独各接一路MIC输入,从而形成
    发表于 01-09 06:05

    ADC的数字电源和模拟电源需要两个隔离的独立电源供电吗?

    请教一下各位,ADC的数字电源和模拟电源需要两个隔离的独立电源供电吗?因为用一电源的话,如果把地平面分为模拟地和数字地,既然ADC下面要将模拟地和数字地短接,又因为二者为同一电源,则电源端处必有
    发表于 01-07 08:15