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

linux-----------------锁

1 常见的锁概念

1-1 死锁

死锁是指在⼀组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站⽤不会
释放的资源⽽处于的⼀种永久等待状态。
所谓死锁就是我在申请一把锁的时候我持有这个锁然后我没有释放的情况下又去申请了一把锁这种情况就会导致死锁
造成的结果是
1-2 死锁得四个必要条件
互斥条件 一个资源每次只能被一个执行流使用
请求与保持条件
一个执行流因申请资源而堵塞时,对持有的资源也不进行释放
不剥夺条件:⼀个执⾏流已获得的资源,在末使⽤完之前,不能强⾏剥夺
循环等待条件:若⼲执⾏流之间形成⼀种头尾相接的循环等待资源的关系
1-3 避免死锁
避免死锁有4个条件
条件1: 锁排序(破坏循环等待)
// 通过内存地址强制排序
void safe_op(std::mutex& mtxA, std::mutex& mtxB) {auto& first = std::min(&mtxA, &mtxB, std::less<void*>());auto& second = std::max(&mtxA, &mtxB, std::less<void*>());std::lock_guard<std::mutex> lk1(*first);std::lock_guard<std::mutex> lk2(*second);// 安全操作共享资源
}

条件2 RAII守卫 + 作用域控制(自动释放)

{std::lock_guard<std::mutex> lk1(mtx1); // 自动释放// 操作资源1...{ // 限制锁作用域std::lock_guard<std::mutex> lk2(mtx2);// 操作资源1+2...} // lk2自动解锁// 此处仅持有mtx1
} // lk1自动解锁

条件3 原子操作替代锁(避免互斥)

std::atomic<int> counter(0);// 无锁自增
void safe_increment() {counter.fetch_add(1, std::memory_order_relaxed);
}

条件4 标准库联合锁(破坏持有并等待)

#include <mutex>void safe_transaction() {std::lock(mtx1, mtx2); // 原子化锁定多个互斥量std::lock_guard<std::mutex> lk1(mtx1, std::adopt_lock);std::lock_guard<std::mutex> lk2(mtx2, std::adopt_lock);// 安全操作双资源
} // 自动解锁

http://www.dtcms.com/a/333709.html

相关文章:

  • [Chat-LangChain] 会话图(LangGraph) | 大语言模型(LLM)
  • 第二十四天:虚函数与纯虚函数
  • 速卖通平台关键字搜索商品列表列表接口实现指南:从接口分析到代码落地
  • Linux之高可用集群实战(二)
  • Tokenizer(切词器)的不同实现算法
  • 异步任务执行顺序
  • DC6v-36V转3.2V1A恒流驱动芯片WT7017
  • 【嵌入式C语言】五
  • 如何一个响指删除计算机里的一半文件?(二)
  • 【工具】多图裁剪批量处理工具
  • 基于element-plus和IndexedDB数据库的基础表单
  • 嵌入式:Linux软件编程:线程
  • 深入浅出的 RocketMQ-面试题解析
  • AI架构师生存手册:图解避坑MCP工具链/智能体RAG/推理蒸馏实战
  • TF 上架协作实战,跨部门配合下的内测发布节奏管理
  • Cursor CLI 技术解析:免费调用 GPT-5 的命令行方案
  • 工控机的用途与介绍:工业自动化的重要引擎
  • [激光原理与应用-287]:理论 - 波动光学 - 电磁波既能承载能量,又能承载信息?
  • Systemd Service 文件详解
  • 反射和类加载机制
  • Leetcode 最小生成树系列(2)
  • 深入解析 Monkey OCR:本地化、多语言文本识别的利器与实践指南
  • 德州扑克游戏术语
  • 什么是Redis的哨兵模式
  • 针对前面2篇文章的一个细节的修订(UAC ADC/DAC录音播放,以及UAC ADC/PWM录音播放)
  • const修饰指针用法详解
  • libdrm 和 libgbm
  • 零基础从头教学Linux(Day 13)
  • 13_集合框架
  • ScanNet项目介绍