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

C++11——RAII 锁封装类

C++ 并发编程中“封装锁机制的智能 RAII 类(Resource Acquisition Is Initialization)”是多线程安全的关键组件。它们的核心思想是:利用对象的构造和析构自动完成加锁与解锁,防止因忘记解锁导致的死锁或未定义行为。

一、std::lock_guard

特点:

  • 构造时自动加锁;

  • 析构时自动解锁;

  • 无法手动解锁或延迟加锁;

  • 性能最好(零开销封装)。

适合场景:
临界区短小、逻辑简单的加锁保护。

#include <mutex>std::mutex mtx;void safe_increment() {std::lock_guard<std::mutex> guard(mtx);// 临界区
}

二、std::unique_lock

项目里面用到

        std::unique_lock<std::mutex> lock(_mutex);

这行代码的作用是:

创建一个 std::unique_lock 对象 lock,并立即对 _mutex 进行加锁(lock)。

lock 对象的生命周期内,互斥量 _mutex 会保持上锁状态;当 lock 对象析构(超出作用域)时,互斥量会自动解锁(unlock)

功能最强、最灵活的锁封装类。

特点:

  • 可延迟加锁:std::unique_lock<std::mutex> lock(mtx, std::defer_lock);

  • 可提前解锁、重新上锁:lock.unlock(); lock.lock();

  • 可与 std::condition_variable 配合;

  • 支持所有权转移(可移动不可复制)。

适合场景:
需要灵活控制锁行为、等待条件变量时。

#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void wait_task() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return ready; });  // 自动解锁、等待、再上锁
}

三、std::shared_lock

特点:

  • std::shared_mutexstd::shared_timed_mutex 搭配;

  • 多个线程可同时持有 shared_lock 共享读

  • 写线程使用 unique_lock 独占访问 单独写

  • 支持延迟加锁、超时加锁、解锁重锁。

适合场景:
读多写少的共享数据(例如缓存或查询系统)。

#include <shared_mutex>std::shared_mutex smtx;void reader() {std::shared_lock<std::shared_mutex> lock(smtx);// 可并发读
}void writer() {std::unique_lock<std::shared_mutex> lock(smtx);// 独占写
}

四、std::scoped_lock(C++17)

同时锁多个互斥量的安全封装器。

特点:

  • 可同时锁住多个 mutex;

  • 自动采用防死锁策略;

  • 析构时自动全部解锁;

  • 不支持解锁再上锁。

适合场景:
函数中需要同时操作多个共享资源。

#include <mutex>std::mutex m1, m2;void safe_func() {std::scoped_lock lock(m1, m2);  // 同时加锁,防止死锁
}

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

相关文章:

  • 怎样在工商局网站做公示南宁兴宁区建设局网站
  • 自己做网站的准备工作个人网站设计html
  • 张家界建设局网站电话号码郑州最新发布
  • 宁波网站建设在哪里服务好的武进网站建设
  • 被骗去国外做网站网站推广国外的建筑设计案例网站
  • 云服务器可以建设个人网站吗网页游戏开服表1区
  • 如何在 Windows 上安装 MySQL(保姆级教程2024版)
  • havoc安装
  • 长沙网站建设排名一个网站项目几个人做
  • Go语言的安装与环境配置
  • MySQL 库表与约束
  • 新西兰签证网站开发镇江网站建设费用
  • 网站搜索引擎优化公司vue手机网站开发
  • FunRec-Task2
  • 怎么把qq空间做成企业网站技术培训学校机构
  • Elasticsearch的快照生命周期管理(SLM)与索引生命周期管理(ILM)功能
  • 中国建设银行人才招聘官方网站电商网站建设思路
  • XRecorder 2.4.6.3 |好用的录屏软件,支持少见的区域录屏和画笔功能
  • 做网站点击赚取广告费中国菲律宾大使馆官网
  • 研发管理知识库(7)什么是Gitflow?
  • 优秀品牌策划方案ppt网站建站前seo注意
  • 重庆网站排名优化教程在线制作条形码免费生成器
  • 松江做网站公司wordpress app模板
  • 免费asp主机网站东营聊城网站建设
  • ubuntu 升级nginx的详细步骤(解决高危漏洞,执行补丁脚本太多,容易出错不如升级到高版本)
  • 做网站方法网站服务是什么
  • 箭头函数
  • 微算法科技(NASDAQ MLGO)开发基于优先级的区块链交易打包算法,提高云边协同计算环境下的交易效率
  • C语言编译单元:深入解析编译原理与优化技巧
  • 如何注册网站域名网站建设应具备的技能