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

c++介绍锁 一

死锁如何产生的:两个或者多个线程,互相等待对方释放资源,从而导致进程或者线程无法继续执行的现象。

造成死锁的条件:

1.互斥条件(Mutual Exclusion):资源一次只能被一个线程占用。

2.请求保持条件(Hold and Wait):线程已经持有至少一个资源,同时又申请新的资源,而新资源被其他线程占有。

3.不剥夺条件(No Preemption): 已获得的资源在未使用完之前,不能被强行剥夺,只能使用完毕后由线程自己释放。

4.循环等待条件:存在一个线程循环等待链,链中的每个线程持有下一个线程所需资源。

如何解决死锁

1:避免循环等待条件:避免形成资源循环等待=链。例如,可以对所有资源进行排序,并按照顺序申请资源,确保不会形成循环等待。

2.破坏请求保持条件:在一个线程申请资源时,不允许它同时持有其他资源。可以使用一次性分配所有资源方法,即线程一次申请它所需要的所有资源,只有在所有资源都满足情况下才开始执行,否则就释放已经获得的资源重新申请。

3.破坏不剥夺条件:如果一个线程申请新的资源时已持有的资源被占用,可以强制释放它已占有的资源。尽管这种方法在实际系统很难实现,但某些情况下是可行的。

4.使用死锁检测和恢复:系统可以定期检测是否存在死锁,如果检测到死锁,即采取恢复措施,例如,终止某些线程并且释放它们占有资源。

5。使用高级同步工具:使用lock和unique_lock等高级同步工具来避免死锁。lock可以同时锁定多个互斥锁。

相关文章:

  • STM32基础教程--旋转编码器计数实验
  • 一文了解汽车图像传感器
  • 爱普生可编程晶振SG-8200CJ特性与应用
  • 狮子座大数据分析(python爬虫版)
  • 前端开发定时器的一些规范使用
  • 数据库的搭建
  • SpringBoot3.3.0集成Knife4j4.5.0实战
  • KidneyTalk-open系统,RAG在医疗场景的真实落地:用于解决肾脏疾病的医疗问答问题
  • vue3深入组件——依赖注入
  • 基于YOLO(以YOLOv8为例)模型开发算法的详细步骤,包含算法代码、训练指导、数据集准备以及可能的改进方向
  • 【C】链式二叉树算法题2
  • C# Channel
  • 【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)
  • 国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)
  • Python开发Scikit-learn面试题及参考答案
  • 下载WindTerm学习的二三知识
  • 利用阿里云Atlas地区选择器与Plotly.js实现数据可视化与交互
  • TicTacToe(井字棋 包含 3*3 和 4*4)游戏开发案例 【C++】
  • 【数据结构】初识集合框架及背后的数据结构(简单了解)
  • Git和GitHub基础教学
  • 特朗普与普京开始电话会谈,稍后将致电泽连斯基
  • 专家:炎症性肠病发病率上升,需加强疾病早期诊断
  • 多名幼师殴打女童被行拘后续,盘锦市教育局工作人员:该局将专项整治全市幼儿园
  • 多所院校高规格召开考研动员会,有学院考研报名率达84%
  • 上海肺科医院院长陈昶:临床中的痛点,正是新技术诞生的起点
  • 聚焦智能浪潮下的创业突围,“青年草坪创新创业湃对”走进北杨人工智能小镇