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

    文章

    3723

    浏览量

    97441
  • 线程
    +关注

    关注

    0

    文章

    510

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS_SMP_Example_S32K358_2xCores示例配置并实现了一SMP项目,两个核心的中断频率比较高时报故障,怎么解决?

    情况是两个核心都被死了。第二条件是,一核心被锁定,而另一核心工作。可能是什么原因?下面是两个
    发表于 03-30 08:23

    两个RS485-Modbus主站如何通讯

    本产品能很好解决Master-1主站向模块写入数据,Master-2主站读取数据;Master-2主站向模块写入数据,Master-1主站读取数据。由此解决两个主站之间的互相读通信难题。
    发表于 02-08 15:32 0次下载

    使用博图(TIA Portal)监控PROFINET从站通讯状态的两个方法

    如何使用博图监控Profinet从站通讯状态,这里有两个方法供你选择。 方法一 | 使用DeviceStates指令 创建全局数据块 在博图项目中,创建一全局数据块(DB),用于存储从站状态信息
    的头像 发表于 01-17 11:21 1549次阅读
    使用博图(TIA Portal)监控PROFINET从站通讯状态的<b class='flag-5'>两个</b>方法

    曙光存储连续斩获两个行业奖项

    近期,曙光存储连续斩获两个行业奖项,自研技术产品在国产突破、AI行业应用等方面的成果获得广泛关注。
    的头像 发表于 01-15 16:28 2725次阅读

    【「Linux 设备驱动开发(第 2 版)」阅读体验】Linux内核开发基础

    时,必须对其进行同步,以确保只有允许访问的竞争者才能拥有该资源。以下是种同步机制: :用于互斥。当一竞争者持有时,其他竞争者不能持有
    发表于 01-12 22:45

    解析Linux的进程、线程和协程

    )轻量级:相对于进程,线程的创建和切换开销较小。 (3)同步与通信:线程之间需要通过同步机制(如互斥、信号量)来保证数据的一致性。 协程(Coroutine) 协程是一种轻量级的
    发表于 12-22 11:00

    线程的系统

    ,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程。 每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后
    发表于 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(&amp;(device-&gt
    发表于 09-10 06:56

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

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

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

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

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

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