死锁产生的四个必要条件:
- 互斥条件:一个资源每次只能被一个执行流使用
- 请求与保持条件:一个执行流因请求资源而阻塞时 , 对已获得的资源保持不放
- 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
- 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系
- 破坏请求和保持条件
- 协议1:所有进程开始前,必须一次性地申请所需的所有资源,这样运行期间就不会再提出资源的需求,破坏了请求条件,即使有一种资源不能满足需求,也不会给它分配正在空闲的资源,这样它就没有资源,就破坏了保持条件,从而预防死锁
- 协议2:允许一个进程只获得初期的资源就开始运行,然后再把运行完的资源释放出来,然后再请求新的资源
- 破坏不可抢占条件
- 当一个已经保持了某种不可抢占资源的进程 , 提出新资源请求不能被满足的时候 , 它必须释放已经保持的所有资源 , 以后需要的时候再申请
- 破坏循环等待条件
- 对系统中的所有资源类型进行线性排序,然后规定每个进程必须按序列号递增的顺序请求资源 。加入进程请求到了一些序列号较高的资源,然后请求一个序列号较低的资源时,必须先释放相同的更高序号的资源后才能申请低序列号的资源,多个同类资源必须一起请求
- 将所有资源进行线性排序,每个进程申请资源的顺序保持一致
#include <stdio.h>#include <pthread.h>#include <unistd.h>//线程的两个互斥量pthread_mutex_t mutex1;pthread_mutex_t mutex2;//线程1处理函数void *fun1(void *arg){ //线程1先申请资源1,再申请资源2 //加锁 pthread_mutex_lock(&mutex1); printf("线程1加锁资源1ok....\n"); pthread_mutex_lock(&mutex2); printf("线程1加锁资源2ok....\n"); printf("线程1执行临界代码"); //解锁 pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex2); return NULL; }//线程2处理函数void *fun2(void* arg){ //线程2先申请资源2,再申请资源1 //加锁 pthread_mutex_lock(&mutex2); printf("线程2加锁资源1ok....\n"); pthread_mutex_lock(&mutex1); printf("线程2加锁资源2ok....\n"); printf("线程2执行临界区代码....\n"); //解锁 pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex1); return NULL;}//演示死锁int main(){ int ret = -1; int ret1 = -1; pthread_t tid1,tid2; //初始化互斥量 pthread_mutex_init(&mutex1,NULL); pthread_mutex_init(&mutex2,NULL); //创建两个线程 pthread_create(&tid1,NULL,fun1,NULL); pthread_create(&tid2,NULL,fun2,NULL); //回收资源 ret = pthread_join(tid1,NULL); ret = pthread_join(tid2,NULL); if(0!=ret) { printf("线程1资源回收失败\n"); return 1; } if(0!=ret1) { printf("线程2资源回收失败\n"); return 1; } //销毁互斥锁 pthread_mutex_destroy(&mutex1); pthread_mutex_destroy(&mutex2); return 0;}运行结果如下:
文章插图
推荐阅读
- 华为watch3可以使用微信吗_华为watch3有微信吗
- Python 多重继承时metaclass conflict问题解决与原理探究
- 神仙记事录第十二章怎么过
- 嘉峪关到张掖-嘉峪关到张掖多少公里
- 多玩LOL盒子战绩查询 英雄联盟战绩查询在线查询系统
- dnf公会勋章怎么获得(dnf公会传说勋章多久能获得)
- 【多服务场景化解决方案】AR虚拟技术助力智能家装
- 一 Linux--多线程
- pta第二次博客
- 1斤等于多少磅 一斤等于多少磅