std::unique_lock的使用

news/2024/11/29 5:33:58/

std::unique_lock 是 C++11 中的一个互斥量封装类,用于提供更灵活和安全的互斥访问。与 std::lock_guard 不同,std::unique_lock 可以随时释放互斥锁,并且支持对互斥量进行延迟加锁和递归加锁。

在使用 std::unique_lock 时,需要先创建一个 std::mutex 对象,然后将其传递给 std::unique_lock 构造函数。例如:

#include <iostream>
#include <mutex>int main() {std::mutex mtx;std::unique_lock<std::mutex> lock(mtx);// accessing shared resourcereturn 0;
}

在上述代码中,mtx 是一个 std::mutex 对象,lock 是一个 std::unique_lock<std::mutex> 对象,用于对 mtx 进行加锁。在 std::unique_lock 对象被销毁时(例如离开函数作用域),它会自动释放对 mtx 的锁定,从而避免了忘记释放锁的问题。

此外,std::unique_lock 还提供了一些其他的功能,例如:

  • 支持延迟加锁:可以在构造函数中将第二个参数设置为 std::defer_lock,表示延迟到后续再加锁。
  • 支持递归加锁:可以在构造函数中将第二个参数设置为 std::defer_lock,然后调用 lock() 函数多次来进行递归加锁。
  • 支持条件变量:可以与 std::condition_variable 配合使用,以实现线程之间的同步。

例如,下面是一个示例程序,展示了如何使用 std::unique_lock 实现延迟加锁和递归加锁:

#include <iostream>
#include <mutex>class Counter {
public:Counter() : value_(0) {}int Get() {std::unique_lock<std::mutex> lock(mtx_);return value_;}void Inc() {std::unique_lock<std::mutex> lock(mtx_);value_++;}void Add(int n) {std::unique_lock<std::mutex> lock(mtx_, std::defer_lock);for (int i = 0; i < n; i++) {lock.lock();value_++;lock.unlock();}}private:int value_;std::mutex mtx_;
};int main() {Counter counter;counter.Inc();std::cout << "Value: " << counter.Get() << std::endl;counter.Add(3);std::cout << "Value: " << counter.Get() << std::endl;return 0;
}

在上述代码中,Counter 类使用 std::unique_lockvalue_ 成员变量进行保护。Inc() 函数和 Add() 函数都使用了 std::unique_lock 对象进行加锁,其中 Add() 函数在开始时使用了 std::defer_lock 延迟加锁,然后在循环内部使用了显式的 lock()unlock() 函数进行递归加锁。


http://www.ppmy.cn/news/382865.html

相关文章

2019-2020年华为暑期实习生及网络精英挑战赛全过程记录(更新至2019/7/30入职半个月)

华为暑期实习生全过程记录 简历投递在线测试笔试华为网络精英挑战赛——基础开发Java方向一、初赛二、复赛和决赛 后续面试一、技术面二、综合面 最后环节入职指导Step1. 网上信息填报Step2. 报到前准备Step3. 报道Step4. 部门报道 简历投递 3.31日前截至&#xff0c;需要记住…

2021 年度湖南省职业院校技能竞赛

2021 年度湖南省职业院校技能竞赛 中职组信息技术类网络搭建与应用赛项竞赛规程 一、赛项名称 1.赛项名称&#xff1a;网络搭建与应用 2.赛项组别&#xff1a;中职组 3.赛项归属&#xff1a;信息技术类 二、赛项简介 本赛项主要考察参赛选手的计算机网络拓扑和 IP 地址规划、综…

目标检测YOLO实战应用案例100讲-基于深度学习的显著性目标检测研究与应用(论文篇)

目录 基于深度学习的显著性目标检测综述 基于深度学习的显著性目标检测分类及难点分析

火山引擎 DataLeap:一个易用、高效的数据目录,是如何搭建的?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 企业如何找到数据、了解数据以及使用数据&#xff1f; 这离不开数据目录的能力。数据目录有着类似于“字典”的作用&#xff0c;能够帮助数据生产者和使用者快速定位…

基于Google breakpad编译构建和使用案例

Googlepad是一款用于程序崩溃时自动生成转储文件&#xff08;.dmp&#xff09;的可跨平台开源库。 1.Googlepad代码下载地址&#xff1a; git clone https://chromium.googlesource.com/breakpad/breakpad 如果翻不了墙可以在gitee上下载breakpad模块。 2.Googlepad采用gyp来…

视频剪辑需要学哪些软件 视频剪辑在哪里学

视频剪辑涉及到素材准备、视频的编辑与生成、格式的转换等方面&#xff0c;因此需要学习到的软件类型也不少。比如在准备素材时&#xff0c;可能会涉及到音频、图片等处理&#xff0c;以及特效的应用等。接下来&#xff0c;就让我们详细了解下视频剪辑需要学哪些软件&#xff0…

逆元(费马小定理、扩展欧几里得、逆元线性打表)

逆元 逆元应用与证明费马小定理方法扩展欧几里得求逆元这里给出扩展欧几里得算法的模板代码&#xff1a; 打表求逆元逆元打表求1&#xff01;~n! 逆元应用与证明 在学习逆元之前我们先来了解一下同余的概念&#xff1a; 简单来讲就是整数a mod(m)b mod(m) &#xff0c;写做 a …

ubuntu 安装网卡驱动

ubuntu 安装网卡驱动 查看当前网卡 # 首先 查看当前所有的 网卡, ifconfig -a # 一定要加 -a (表示all) # 若有显示,说明识别成功,再查看目前已经启动的网卡有没有 ifconfig # 查看目前启动的网卡 (防止识别到了硬件,但没有启动,热插拔未启动的现象)下载相应的驱动 #…