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

    文章

    3473

    浏览量

    92852
  • 线程
    +关注

    关注

    0

    文章

    497

    浏览量

    19545
收藏 人收藏

    评论

    相关推荐

    STM32F107中断死循环的原因?

    STM32F107,中断死循环
    发表于 05-11 06:31

    聊聊MCU死循环,用for(;;)还是while(1)?

    首先,问大家一个问题:你们写单片机程序【死循环】时,喜欢用for(;;)还是while(1)?快来为你喜欢用的【死循环】打call,评论区等你哦~一位工程师发现,国外工程师在给demo在做死循环
    的头像 发表于 04-29 08:10 276次阅读
    聊聊MCU<b class='flag-5'>死循环</b>,用for(;;)还是while(1)?

    如何让同一条件结构里的两个循环同时独立运行

    由于两个循环里都用了定时功能,导致两个循环都被那个设置时间长的定时影响了
    发表于 04-08 11:35

    为何国外工程师偏爱使用for(;;)来实现MCU死循环

    一位工程师发现,国外工程师在给demo在做死循环时用的是for(;;),而不是常用的while(1)。这仅仅是个人习惯的问题,还是有更深层次的含义?
    发表于 04-01 11:26 264次阅读
    为何国外工程师偏爱使用for(;;)来实现MCU<b class='flag-5'>死循环</b>?

    请问rtt线程内必须显式调用调度函数吗?

    我在一线程中 当创建对象失败的时候,会使用while(1)printf(“create obj failed!!\\n”) 方式进入死循环,这时候其他线程就不在运行了(表现是LCD上
    发表于 02-26 06:36

    RTThread中main线程循环,如果main线程异常退出了,有什么办法可以监测到?

    RTThread中main线程循环,如果main线程异常退出了,有什么办法可以监测到?
    发表于 02-22 08:15

    为什么HashMap会产生死循环呢?

    死循环问题发生在 JDK 1.7 版本中,造成这个问题主要是由于 HashMap 自身的运行机制,加上并发操作,从而导致了死循环
    的头像 发表于 12-21 09:06 403次阅读
    为什么HashMap会产生<b class='flag-5'>死循环</b>呢?

    互斥锁和自旋锁的区别 自旋锁临界区可以被中断吗?

    互斥锁和自旋锁的区别 自旋锁临界区可以被中断吗? 互斥锁和自旋锁是在多线程编程中常用的锁机制,它们用于保护共享资源的并发访问,但在实现和使用方式上存在一些区别。 互斥锁是一种阻塞式的锁
    的头像 发表于 11-22 17:41 514次阅读

    互斥锁及条件变量的使用

    本文主要分为三个部分: 第一部分简要介绍线程的概念及其使用 第二部分主要介绍互斥锁及条件变量的使用(重点探讨pthread_cond_wait) 第三部分参考运行IBM的多线程工作代码作为
    的头像 发表于 11-10 14:51 306次阅读
    <b class='flag-5'>互斥</b>锁及条件变量的使用

    线程池的应用

    线程池的应用 在我认知中,任何网络服务器都是一个死循环。这个死循环长下面这个样子。 基本上服务器框架都是基于这个架构而不断开发拓展的。 这个死循环总共分为四个步骤,可以涵盖所有客户端的
    的头像 发表于 11-10 11:07 235次阅读
    <b class='flag-5'>线程</b>池的应用

    c++线程中锁的基本类型和用法

    线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能与性能成反比。不过我们一般不使用递归锁(C++标准库提供了std::recursive_mutex),所以这里就不
    的头像 发表于 11-09 15:02 641次阅读
    c++<b class='flag-5'>线程</b>中锁的基本类型和用法

    在没有操作系统的情况下怎么实现一互斥

    应该怎么实现这个互斥
    发表于 10-13 07:48

    线程中获取互斥量导致程序卡死的原因?如何修改?

    1、对于互斥量不能再中断中使用的限制,我已经明白。 2、现在开了一RS232的接收线程,RS232接收是中断接收,在线程中去轮询RS232的接收,如果接收到数据,则会执行获取
    发表于 08-20 11:35

    Linux线程条件变量是什么意思

    条件变量 条件变量用于自动阻塞线程,直到某个特定事件发生或某个条件满足为止,通常情况下,条件变量是和互斥锁一起搭配使用的。使用条件变量主要包括两个动作: 一个线程等待某个条件满足而被阻
    的头像 发表于 07-21 11:18 365次阅读

    Linux互斥锁的作用 互斥锁是什么

    1、互斥互斥锁(mutex),在访问共享资源之前对互斥锁进行上锁,在访问完成后释放互斥锁(解锁);对互斥锁进行上锁之后,任何其它试图再次
    的头像 发表于 07-21 11:13 663次阅读