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

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

    关注

    88

    文章

    3690

    浏览量

    95395
  • 线程
    +关注

    关注

    0

    文章

    508

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

    从时域和频域两个角度对信号进行分析

    一般来说,我们会从时域和频域两个角度,分别对信号进行分析。 时域 时域是真实世界存在的域,按时间顺序呈现。例如,在某个时钟信号的时域图中,可以观察到两个重要的参数,波形的周期和上升沿: 时钟周期即
    的头像 发表于 11-19 10:18 ?3519次阅读
    从时域和频域<b class='flag-5'>两个</b>角度对信号进行分析

    两个循环里后台读取串口信息了,和前面板有一按钮 怎么去控制另外的同一动作呢

    我在两个循环里 读取串口信息了, 怎么去控制另外的同一动作呢 大佬们,这个可以实现吗,。目前搞到了是串口接收循环里,收到字符串,就比较长度,符合就触发来另外
    发表于 10-19 09:25

    单相电机两个绕组都在定子上吗

    单相电机的两个绕组,即起动线圈(或称为辅助绕组、副绕组)和运行线圈(或称为主绕组),都位于定子上 。这两个绕组在电机中起着关键作用,共同协作以产生旋转磁场,从而使电机能够运转。 单相电机通常由一
    的头像 发表于 09-03 15:10 ?2308次阅读

    ad如何设置两个元器件的距离

    在Altium Designer(简称AD)中设置两个元器件之间的距离,主要是通过设置元器件间的安全间距(Clearance)规则来实现的。这个规则定义了元器件之间、元器件与走线之间以及其他设计元素
    的头像 发表于 09-02 15:31 ?1.7w次阅读

    基于OpenHarmony标准系统的C++公共基础类库案例:rwlock

    1、程序简介该程序是基于OpenHarmony的C++公共基础类库的读写:rwlock。本案例主要完成如下工作:创建3线程,每个读线程循环
    的头像 发表于 08-30 12:42 ?678次阅读
    基于OpenHarmony标准系统的C++公共基础类库案例:rwlock

    简述基本与非门sr存器的结构及工作原理

    。以下是对其基本结构及工作原理的简述: 一、结构 基本与非门SR存器主要由两个与非门组成,这两个与非门的输出分别连接到对方的输入端,形成交叉反馈的结构。具体来说,
    的头像 发表于 08-28 11:01 ?4360次阅读

    sr存器和rs触发器一样吗

    基本的数字电路元件,用于存储一比特(bit)的数据。它由两个互补的门电路组成,通常是两个非门(反相器)或其他逻辑门电路,通过交叉连接形成两个
    的头像 发表于 08-28 09:31 ?2625次阅读

    sr存器特性表q为什么有两个

    SR存器特性表中Q之所以有两个值,是因为这些值分别代表了存器在不同输入条件下的状态。具体来说,Q的两个值分别对应了存器的“当前状态”(
    的头像 发表于 08-28 09:28 ?1514次阅读

    sr存器如何确定q的值

    开关(通常是由逻辑门电路构成)组成,可以将输入信号存为输出信号。其基本结构通常包括两个或非门(NOR gate)或与非门(NAND gate)交叉连接而成,形成两个相互依赖的存储单元
    的头像 发表于 08-28 09:23 ?1340次阅读

    功放机AB两个声道输出怎么接

    功放机AB两个声道输出的接线方式,主要取决于您想要实现的音频效果以及音箱的配置。以下将详细介绍几种常见的接线方式,以及它们各自的特点和适用场景。 一、基础接线方式 在大多数情况下,功放机的AB两个
    的头像 发表于 08-23 10:40 ?9920次阅读

    触发器的两个稳定状态分别是什么

    触发器作为数字电路中的基本逻辑单元,具有两个稳定状态,这两个状态通常用于表示二进制数码中的0和1。
    的头像 发表于 08-12 11:01 ?3138次阅读

    双稳态电路的两个稳定状态是什么

    双稳态电路是一种具有两个稳定状态的电子电路,广泛应用于数字电路、通信系统、存储器等领域。 双稳态电路的基本概念 双稳态电路是一种具有两个稳定状态的电路,即在没有外部输入信号的情况下,电路可以保持在
    的头像 发表于 08-11 15:00 ?2697次阅读

    双稳态触发器的两个基本性质是什么

    双稳态触发器(Bistable Trigger)是一种具有两个稳定状态的逻辑电路,广泛应用于数字电路设计中。它具有两个基本性质:记忆性和切换性。 一、双稳态触发器的基本概念 1.1 双稳态触发器
    的头像 发表于 08-11 10:08 ?1435次阅读