死锁
- 🥭什么是死锁
- 🥥死锁产生的条件
- 🥝如何避免死锁
- 🍅 避免死锁算法
🥭什么是死锁
死锁是多线程或多进程编程中的一种常见问题,指的是两个或多个线程(或进程)相互等待对方持有的资源,导致程序无法继续执行下去,进而陷入无限等待的状态。
🥥死锁产生的条件
- 互斥条件:一个资源每次只能被一个执行流使用
- 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
也就是说,不会因为线程权限的优先级问题拿到别的线程的锁! - 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系
结合代码说明一下:
- 代码1
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include<iostream>
#include <sys/syscall.h>
using namespace std;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int cnt=50;
void *Func(void * args)
{string name = static_cast<char *>(args);while (true){pthread_mutex_lock(&mutex); //加锁 cout<<name<<"count:"<<cnt--<<endl;pthread_mutex_unlock(&mutex);sleep(1);}}int main()
{pthread_t td1;pthread_t td2;pthread_t td3;pthread_t td4;pthread_create(&td1,nullptr,Func,(void*)"td1");pthread_create(&td2,nullptr,Func,(void*)"td2");pthread_create(&td3,nullptr,Func,(void*)"td3");pthread_create(&td4,nullptr,Func,(void*)"td4");pthread_join(td1,nullptr);pthread_join(td2,nullptr);pthread_join(td3,nullptr);pthread_join(td4,nullptr);return 0;
}
- 运行
正常运行没发现异常 多线程执行–操作
举例:这时候如果不小心把unlock写成lock:
这里直造成死锁,原因是:一个线程去访问临界资源的时候,申请了一把锁,然后往下执行代码又去申请了一把锁,而这时候去申请锁的时候发现没有了,就进入了挂起等待的状态,等待其他线程把锁还回来,但是此时锁正在它自己手上,就永远等不到第二次申请的这把锁,这就造成了死锁…
🥝如何避免死锁
- 破坏死锁的四个必要条件
- 加锁顺序一致
- 避免锁未释放的场景
- 资源一次性分配
🍅 避免死锁算法
银行家算法 点击跳转: 银行家算法
相关博客:
链接: 死锁面试
🍆 🥑 🥦 🥬 🥒 🌶 🌽 🥕 🧄 🧅 🥔 🍠 🥐 🥯 🍞 🥖 🥨 🧀 🥚