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

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

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)

相关文章
|
6月前
|
监控 算法 安全
|
6月前
|
安全 算法 程序员
|
6月前
|
安全 Java 测试技术
发生死锁怎么办
发生死锁怎么办
66 0
|
6月前
死锁的发生与避免
死锁的发生与避免 死锁是指两个或者多个进程在执行过程中,因争夺资源而造成的一种僵局,若无外力作用,它们都将无法推进下去。在计算机系统中,死锁是一种常见的问题,因此需要采取一些措施来避免死锁的发生。
|
算法 安全
死锁的总结(2)
死锁的总结
47 0
|
安全 算法
死锁的总结(1)
死锁的总结
33 0
|
算法 调度
死锁的理解
死锁的理解
83 0
|
安全 算法
初识死锁问题
关于对死锁的详解
|
程序员 Linux 芯片