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

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)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值