当前位置: 首页 > news >正文

专业做网站路桥寺院网站建设方案

专业做网站路桥,寺院网站建设方案,如何优化网站首页,级a做爰片免费视网站看看死锁的概念 在多线程编程中#xff0c;我们为了防止多线程竞争共享资源而导致数据错乱#xff0c;都会在操作共享资源之前加上互斥锁#xff0c;只有成功获得到锁的线程#xff0c;才能操作共享资源#xff0c;获取不到锁的线程就只能等待#xff0c;直到锁被释放。 那…死锁的概念 在多线程编程中我们为了防止多线程竞争共享资源而导致数据错乱都会在操作共享资源之前加上互斥锁只有成功获得到锁的线程才能操作共享资源获取不到锁的线程就只能等待直到锁被释放。 那么当两个线程为了保护两个不同的共享资源而使用了两个互斥锁那么这两个互斥锁应用不当的时候可能会造成两个线程都在等待对方释放锁在没有外力的作用下这些次线程会一直相互等待就没法继续运行这种情况就是发生了死锁。 死锁必须同时满足以下四个条件才会发生 互斥条件持有并等待条件不可剥夺条件环路等待条件 互斥条件 互斥条件式指多个线程不能同时使用同一个资源。 eg如果线程A已经持有的资源不能同时被线程B持有如果线程B请求获取线程A已经占用的资源那线程B只能等待直到线程A释放了资源。 持有并等待条件 持有并等待条件是指当线程 A 已经持有了资源 1 又想申请资源 2 而资源 2 已经被线程 C 持有了所以线程 A 就会处于等待状态但是线程 A 在等待资源 2 的同时并不会释放在自己已经持有的资源 1 。 不可剥夺条件 不可剥夺条件是指当线程已经持有了资源在自己使用完之前不能被其他线程获取线程 B 如果也想使用此资源则只能在线程 A 使用完并释放后才能获取。 环路等待条件 环路等待条件是指在死锁发生的时候两个线程获取资源的顺序构成了环形链。 模拟死锁问题的产生 用代码来模拟死锁问题的产生。 首先我们创建 2 个线程分别为线程A和线程B然后有两个互斥锁分别是 mutex_A 和 mutex_B,代码如下 pthread_mutex_t mutex_A PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex_B PTHREAD_MUTEX_INITIALIZER;int main() {pthread_t tidA, tidB;//创建两个线程pthread_create(tidA, NULL, threadA_proc, NULL);pthread_create(tidB, NULL, threadB_proc, NULL);pthread_join(tidA, NULL);pthread_join(tidB, NULL);printf(exit\n);return 0; } 线程A函数 //线程函数 A void *threadA_proc(void *data) {printf(thread A waiting get ResourceA \n);pthread_mutex_lock(mutex_A);printf(thread A got ResourceA \n);sleep(1);printf(thread A waiting get ResourceB \n);pthread_mutex_lock(mutex_B);printf(thread A got ResourceB \n);pthread_mutex_unlock(mutex_B);pthread_mutex_unlock(mutex_A);return (void *)0; } 可以看到线程A函数的过程 先获取互斥锁 A 然后睡眠 1 秒再获取互斥锁 B 然后释放互斥锁 B最后释放互斥锁 A //线程函数 B void *threadB_proc(void *data) {printf(thread B waiting get ResourceB \n);pthread_mutex_lock(mutex_B);printf(thread B got ResourceB \n);sleep(1);printf(thread B waiting get ResourceA \n);pthread_mutex_lock(mutex_A);printf(thread B got ResourceA \n);pthread_mutex_unlock(mutex_A);pthread_mutex_unlock(mutex_B);return (void *)0; } 可以看到线程B函数的过程 先获取互斥锁 B 然后睡眠 1 秒再获取互斥锁 A然后释放互斥锁 A最后释放互斥锁 B 然后运行这个程序。结果如下 thread B waiting get ResourceB thread B got ResourceB thread A waiting get ResourceA thread A got ResourceA thread B waiting get ResourceA thread A waiting get ResourceB // 阻塞中。 可以看到线程 B 在等待互斥锁 A 的释放线程 A 在等待互斥锁 B 的释放双方都在等待对方资源的释放 - 产生了死锁。 避免死锁问题的发生 前面说到产生死锁的四个必要条件是互斥条件、持有并等待条件、不可剥夺条件、环路等待条件。 那么避免死锁问题就只需要破坏其中一个条件就可以最常见的并且可行的就是使用资源有序分配法来破坏环路等待条件。 资源有序分配法 线程 A 和线程 B 获取资源的顺序要一样当线程 A 是先尝试获取资源 A 然后尝试获取资源 B 的时候线程 B 同样也是先尝试获取资源A 然后尝试获取资源 B 。也就是说线程 A 和 线程 B 总是以相同的顺序申请自己想要的资源。 我们使用资源有序分配法的方式来修改前面发生死锁的代码我们可以不改动线程 A 的代码。 我们先要清楚线程 A 获取资源的顺序它是先获取互斥锁 A 然后获取互斥锁 B。 所以我们只需要将线程B改成以相同顺序的获取资源就可以打破死锁了。 线程 B 函数改进后的代码如下 //线程 B 函数同线程 A 一样先获取互斥锁 A然后获取互斥锁 B void *threadB_proc(void *data) {printf(thread B waiting get ResourceA \n);pthread_mutex_lock(mutex_A);printf(thread B got ResourceA \n);sleep(1);printf(thread B waiting get ResourceB \n);pthread_mutex_lock(mutex_B);printf(thread B got ResourceB \n);pthread_mutex_unlock(mutex_B);pthread_mutex_unlock(mutex_A);return (void *)0; } 总结 简单来说死锁问题的产生是由两个或者以上线程并行执行的时候争夺资源而互相等待造成的。 死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。 所以要避免死锁问题就是要破坏其中一个条件即可最常用的方法就是使用资源有序分配法来破坏环路等待条件。
http://www.w-s-a.com/news/125573/

相关文章:

  • 网站维护与优化教程广州做网站的网络公司排名
  • 网站做贷款许可证网站改版方案模板
  • 装饰公司怎么做网站嘉兴网站制作推广
  • 深圳兼职做网站涿州网站制作
  • 能找本地人做导游的网站app模板素材下载免费
  • 网站积分的作用网站开发需要看相关书籍
  • 建设银行总行网站alexa排名与什么有关系
  • 阿里云服务器发布网站收款网站怎么建设
  • 开发东莞网站制作公司做网站优化步骤
  • 网站版权信息的正确写法如何制作网络游戏
  • 郑州移动端网站建设如何在网上推广自己的公司
  • 企业建站源码系统破解网站后台
  • 石家庄网站开发报价企业注册资本代表什么
  • 招商平台公司宁波seo教程推广平台
  • 哪些网站可以做房产推广垂直门户网站都有什么
  • 不得不知道的网站金石项目管理软件
  • 怎么恢复网站数据库网站开发作业代做
  • 哪里建设网站最好用中国第五冶金建设公司医院网站
  • 雄安网建 网站建设订餐网站建设
  • 广州视频网站建站公司网站 体系
  • 青浦门户网站网站推广烟台公司电话
  • 湖北荆门建设银行网站wordpress购物模板下载
  • 学ui+wordpress模板北京推广优化
  • 建分类网站得花多少钱深圳设计网站开发
  • 网站集群建设和网站集约化百度商桥怎么绑定网站
  • 青岛模板网站建设价格网络品牌网站建设
  • 网站建设的几大要素网站的做网站的公司
  • 怎么登陆自己的公司网站垂直电商网站建设
  • 温州微网站制作哪里有许昌网站建设哪家最好
  • 中国中小企业网站官网网页制作工具按其制作方式分 可以分为