什么是死锁?互斥锁进入死锁怎么解决?

这篇具有很好参考价值的文章主要介绍了什么是死锁?互斥锁进入死锁怎么解决?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.死锁是什么?

(1)死锁是一组相互竞争资源的线程因为他们之间得到互相等待导致“永久“阻塞的现象; (你等我 我等你 你不放我也不放 就导致“永久“阻塞的现象)

(2)死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

简单来说就是由于你的互斥锁使用不当,导致多个线程无法进行代码的下一步运行

2.发生死锁的原因?

分为下面4钟原因

互斥条件 共享资源 X y 只能被一个线程占有
占用且等待 线程T1占用的共享资源X 他在等待共享Y的时候帮不释放自己的X
不可抢占 其他线程不能去抢占t1线程占有的资源
循环等待 线程t1 等t2 占有的资源,线程t2 等t1占有的资源 循环等等

3.如何避免死锁?

(1)互斥条件    无法破坏的因为锁本身就是通过互斥解决线程的安全的问题
占用且等待    一次性申请所有的资源就不会存在等待了
(2)不可抢占    占用部分资源的线程,进一步申请其他的资源的时候如果申请不到可以主动释放他占有的资源,这样就破坏了不可抢占
(3)循环等待    按照顺序申请资源进行预防,所谓按序申请是指资源是有线性顺序的,申请的时候可以先申请资源序号小的 在申请资源序号大的 ,这样线性化循环就不存在等待了

代码示例:线程一想要线程二手上的锁,线程二也想要线程一手上的锁,所以都不去解锁

(线程t1 等t2 占有的资源,线程t2 等t1占有的资源 循环)

#include <stdio.h>
#include <pthread.h>

//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
int g_data = 0;

//首先要有两个锁才会出现死锁情况
pthread_mutex_t mutex;
pthread_mutex_t mutex2;


void *func1(void *arg)
{
    int i;

    pthread_mutex_lock(&mutex);
    sleep(1);
    pthread_mutex_lock(&mutex2);
    

    for(i=0;i<5;i++){
        printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
        printf("t1:param is %d\n",*((int *)arg));
        sleep(1);
    }
    pthread_mutex_unlock(&mutex);

}

void *func2(void *arg)
{

    
    pthread_mutex_lock(&mutex2);
    sleep(1);
    pthread_mutex_lock(&mutex);

    printf("t2:%ld thread is create\n",(unsigned long)pthread_self());
    printf("t2:param is %d\n",*((int *)arg));

    pthread_mutex_unlock(&mutex);

}

void *func3(void *arg)
{

    pthread_mutex_lock(&mutex);

    printf("t3:%ld thread is create\n",(unsigned long)pthread_self());
    printf("t3:param is %d\n",*((int *)arg));

    pthread_mutex_unlock(&mutex);

}

int main()
{
    int ret;
    int param = 100;
    pthread_t t1;
    pthread_t t2;
    pthread_t t3;

    pthread_mutex_init(&mutex, NULL);
    pthread_mutex_init(&mutex2, NULL);

    
    ret = pthread_create(&t1, NULL, func1,(void *)&param);
    if(ret == 0){
        printf("main:create t1 success\n");
    }

    ret = pthread_create(&t2, NULL, func2,(void *)&param);
    if(ret == 0){
        printf("main:create t2 success\n");
    }

    ret = pthread_create(&t3, NULL, func3,(void *)&param);
    printf("main:%ld\n",(unsigned long)pthread_self());

    pthread_join(t1,NULL);
    pthread_join(t2,NULL);

    pthread_mutex_destroy(&mutex);
    pthread_mutex_destroy(&mutex2);

    return 0;
}
编译结果:线程一二卡死不运行,线程三有时候可运行

(1)

什么是死锁?互斥锁进入死锁怎么解决?

(2)

什么是死锁?互斥锁进入死锁怎么解决?文章来源地址https://www.toymoban.com/news/detail-464506.html

到了这里,关于什么是死锁?互斥锁进入死锁怎么解决?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统进程线程(三)—进程状态、同步互斥、锁、死锁

    原子操作的概念 原子操作就是不可中断的一个或者一系列操作。 原子操作如何实现 总线锁定 使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号的时候,其他处理器的请求将被阻塞住,那么该处理器可以独占内存。 缓存锁 总线锁开销比较大,因为把CPU和内

    2024年02月04日
    浏览(52)
  • 什么是死锁,如何解决

    死锁是指在执行过程中,两个或两个以上的进程(或线程)由于竞争资源或彼此通信而阻塞,导致无法继续执行的情况。 如果没有外部干预,这些进程将无法向前推进。 这种状态被称为系统死锁或死锁产生。 这些相互等待的进程被称为死锁进程。 死锁案例: 🕵️‍♀️面

    2024年02月15日
    浏览(44)
  • 惠普电脑/笔记本电脑为什么左下角会出现 按 ESC 进入启动选项,怎么关闭

    惠普电脑/笔记本电脑为什么左下角会出现 按 ESC 进入启动选项,怎么关闭 查看: 现象提示图片示例: ![v 出现原因 出现这个提示,说明你关闭了 『安全启动』,开启了 『传统模式』 解决方法 首先确定你的硬盘分区是 『MBR 』还是 『GPT』,如果你的『引导盘/系统盘分区』

    2024年02月10日
    浏览(175)
  • 死锁是什么?死锁的字节码指令了解?

    用幽默浅显的言语来说死锁 半生:我已经拿到了机考的第一名,就差笔试第一名了 小一:我已经拿到了笔试的第一名,就差机考第一名了 面试官:我很看好你俩,继续\\\"干\\\", 同时拿到2个的第一名才能拿到offer,进入我XX大厂 半生:小一,你的笔试第一名,让我可好? 小一:

    2024年02月09日
    浏览(37)
  • (学习笔记-进程管理)怎么避免死锁?

    在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那么,当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,

    2024年02月12日
    浏览(53)
  • 什么条件下会出现死锁,如何避免?

    死锁,简单来说就是两个或者两个以上的线程在执行过程中,去争夺同一个共享资源导致相互等待的现象。如果没有外部干预,线程会一直处于阻塞状态,无法往下执行。这样一直等待处于阻塞状态的线程,被称为死锁线程。 产生死锁需要同时满足以下四个条件: 第一个:

    2024年02月12日
    浏览(55)
  • 越细粒度的锁越好吗?产生死锁怎么办?

    大家好,我是哪吒。 上一篇提到了锁粒度的问题,使用“越细粒度的锁越好”,真的是这样吗?会不会产生一些其它问题?

    2024年02月08日
    浏览(42)
  • Mysql 死锁和死锁的解决方案

    前置知识:需要了解锁的种类,如表锁、行锁;行锁又分为记录锁、间隙锁、临键锁等等;什么情况下会加表锁,什么情况下会加行锁,什么情况下会加临键锁,什么情况锁会升级等等。。。网上讲解很多,这里就不单独讲述了 一 表死锁 产生原因: 用户A访问表A(锁住了表

    2024年02月02日
    浏览(61)
  • 什么是HTTP 500错误,怎么解决

    目录 什么是HTTP 500 HTTP 500错误的常见原因: 如何修复HTTP 500 总结 HTTP 500内部服务器错误是指在客户端发出请求后,服务器在处理请求过程中发生了未知的问题,导致服务器无法完成请求。HTTP 500错误是一个通用的服务器错误状态码,它表示服务器遇到了无法处理的错误,从而

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包