死锁的四个必要条件及死锁伪代码
- 互斥条件
死锁的发生一定是在对临界资源的访问上,即同一时刻资源只能由一个进程访问。
- 持有且保持条件
进程占有一个资源同时请求另一资源,在未获取另一资源的情况下并不释放原有资源。
- 不可抢占条件
低优先级进程占有的资源在自由释放前,不可被其他进程抢占。
- 环路等待条件
发生死锁时必定会有一条进程-资源环形等待链,即存在进程p0、p1、、、、pn,p0在等待p1释放资源,p1在等待p2释放资源,、、、、,pn在等待p0释放资源。
所以我们可以从破坏以上4个条件的成立来防止死锁的发生。
- 死锁伪代码
1、连续对同一个互斥量两次加锁
thread_fun(){ pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); pthread_mutex_unlock(&mutex): }
2、线程A对互斥量一加锁同时等待互斥量二解锁,线程B对互斥量二加锁同时等待互斥量一解锁
thread_fun1(){ pthread_mutex_lock(&mutex1); pthread_mutex_lock(&mutex2); pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); } thread_fun2(){ pthread_mutex_lock(&mutex2); pthread_mutex_lock(&mutex1); pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex2); }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步