c++ std::unique_lcock 详解

std::unique_lock  C++ 标准库中的一个类,用于管理对互斥锁(std::mutex 或其派生类)的锁定和解锁。它提供了比 std::lock_guard 更灵活的控制,允许在需要时延迟锁定、提前解锁以及递归锁定等。

主要特性

  1. 延迟锁定:std::unique_lock 可以在创建时不立即锁定互斥锁,而是在稍后的时间点调用 lock() 或 try_lock() 方法来锁定。
  2. 提前解锁:通过调用 unlock() 方法,可以在不销毁 std::unique_lock 对象的情况下解锁互斥锁。这允许在锁定期间执行不需要互斥锁的操作。
  3. 所有权转移:std::unique_lock 对象可以通过移动语义(使用 std::move)来转移其所有权,从而在不释放锁的情况下将锁传递给另一个 std::unique_lock 对象。
  4. 递归锁定:如果互斥锁是可递归的(即 std::recursive_mutex),则 std::unique_lock 可以多次锁定同一个互斥锁,而不会产生死锁。
  5. 条件变量:std::unique_lock 通常与 std::condition_variable 一起使用,因为 std::condition_variable 的 wait() 方法需要一个 std::unique_lock 参数来自动解锁和重新锁定互斥锁。

使用方法

  1. 创建和锁定

std::mutex mtx;

std::unique_lock<std::mutex> lck(mtx); // 立即锁定 mtx

或者延迟锁定:

std::unique_lock<std::mutex> lck(mtx, std::defer_lock); // 不立即锁定

lck.lock(); // 稍后锁定

  1. 提前解锁

lck.unlock(); // 解锁 mtx

注意,在解锁后重新使用 lck 前,必须确保没有其他线程已经锁定了 mtx,否则可能会导致未定义的行为。

  1. 所有权转移

std::unique_lock<std::mutex> lck1(mtx);

std::unique_lock<std::mutex> lck2 = std::move(lck1); // lck1 不再拥有锁,lck2 现在拥有锁

  1. 与条件变量一起使用

std::condition_variable cv;

std::mutex mtx;

std::unique_lock<std::mutex> lck(mtx);

cv.wait(lck, []{ /* 条件检查 */ }); // 在等待期间,lck 会自动解锁和重新锁定 mtx

  1. 递归锁定(如果使用的是 std::recursive_mutex):

std::recursive_mutex rmtx;

std::unique_lock<std::recursive_mutex> rlck(rmtx);

rlck.lock(); // 可以多次锁定同一个 rmtx,不会产生死锁

注意事项

  • 不要混合使用 std::lock_guard 和 std::unique_lock 来管理同一个互斥锁,因为这可能会导致未定义的行为。
  • 在使用 std::unique_lock 时,要特别小心避免在解锁后重新使用它之前让其他线程锁定相同的互斥锁。
  • std::unique_lock 在其析构函数中会自动解锁互斥锁(除非它已经处于未锁定状态)。因此,通常不需要显式调用 unlock(),除非有特定的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter分布式集群压测

目的&#xff1a;通过多台机器同时运行 性能压测 脚本&#xff0c;模拟更好的并发压力 简单点&#xff1a;就是一个人&#xff08;控制机controler/调度机 master&#xff09;做一个项目的时候&#xff0c;压力有点大&#xff0c;会导致结果不理想&#xff0c;这时候找几个人&a…

OS复习笔记ch5-4-2

引言 承接上文我们介绍了信号量机制和应用信号量机制实现的进程同步和互斥&#xff0c;这一节我们将围绕一些经典问题对信号量机制展开更深入地探讨。 读者/写者问题 读者/写者问题与我们之前遇到的问题类型不同&#xff0c;它描述的是&#xff1a; 有读者和写者两组进程&am…

ohmyzsh的安装过程中失败拒绝连接问题的解决

1.打开官网Oh My Zsh - a delightful & open source framework for Zsh 在官网能看到下面的界面 有这两种自动安装的方式 个人本次选择的是: wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O - 1.打开终端输入安装的指令 sh -c "$(wget…

软件需求工程习题

1.&#xff08;面谈&#xff09;是需求获取活动中发生的需求工程师和用户间面对面的会见。 2.使用原型法进行需求获取&#xff0c;&#xff08;演化式&#xff09;原型必须具有健壮性&#xff0c;代码质量要从一开始就能达到最终系统的要求 3.利用面谈进行需求获取时&#xf…

K邻近算法

简介 介绍了非常简单的算法&#xff1a;K邻近算法&#xff0c;即KNN。 基本介绍 K-近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种基本且广泛应用的监督学习算法&#xff0c;主要用于分类和回归任务。 工作原理非常简答直观&#xff1a;所谓…

爆款小红书免费流量体系课程(两周变现),小红书电商教程

课程下载&#xff1a;小红书电商教程-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-爆款标题(三段式取标题).mp3 11-爆款封面怎么作图.mp3 12-爆款内容的模板(三段式模板).mp3 13-小红书流量推荐背后的秘密(四大流…

Docker——目录迁移

我们在生产环境中安装Docker时&#xff0c;默认的安装目录是/var/lib/docker&#xff0c;而通常情况下&#xff0c;规划给系统盘的目录一般为50G&#xff0c;该目录是比较小的&#xff0c;一旦容器过多或容器日志过多&#xff0c;就可能出现Docker无法运行的情况&#xff0c;所…

数据结构与算法-排序算法1-冒泡排序

本文先介绍排序算法&#xff0c;然后具体写冒泡排序。 目录 1.排序算法简介 2.常见的排序算法分类如下图&#xff1a; 3.冒泡排序&#xff1a; 1.介绍&#xff1a; 2.动态图解 3.举例 4.小结冒泡排序规则 5.冒泡排序代码 6.优化 7.优化后时间 代码&#xff1a; 运…

软链接(Symbolic link)和硬链接(Hard link)有什么区别:

软链接&#xff08;Symbolic link&#xff09;和硬链接&#xff08;Hard link&#xff09;是文件系统中两种不同类型的链接。它们之间有一些重要的区别&#xff1a; 链接目标&#xff1a; 软链接&#xff1a;软链接是一个指向目标文件或目录的符号链接&#xff0c;实际上是一个…

讯方·智汇云校4月HCIE通过28人!证书量总计123!

智汇云校捷报 —4月华为认证证书量123本— 智汇云校4月IE捷报来了 讯方技术2024年PMP第一期3月考期顺利结班&#xff0c;考试全员通过~ 2024年4月&#xff0c;云校HCIA、HCIP、HCIE共通过123人&#xff01; 62人通过HCIA 33人通过HCIP 28人通过HCIE 祝贺以下学员通过HC…

simulink-仿真以及PID参数整定/PID tuner 的使用流程

控制器搭建与参数整定 搭建一个前馈PID控制器控制系统PID tuner使用 一个懂点控制但不多的小白&#xff0c;因为需要利用simulink仿真&#xff0c;所以不得不学习一些仿真的知识&#xff0c;这篇文章适合和我一样的新手入门&#xff0c;有理解错误的地方希望大手们能够指出来共…

Llama3-Tutorial(Llama 3 超级课堂)-- 笔记

第1节—Llama 3 本地 Web Demo 部署 端口转发 vscode里面设置端口转发 https://a-aide-20240416-b4c2755-160476.intern-ai.org.cn/proxy/8501/ ssh -CNg -L 8501:127.0.0.1:8501 rootssh.intern-ai.org.cn -p 43681参考 https://github.com/SmartFlowAI/Llama3-Tutorial/b…

ssm123基于java web的网上书城系统的设计与实现+vue

基于java web的网上书城系统的设计与实现vue 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;商品交易当然也不能排除在外&#xff0c;随着商品交易管理的不断成熟&#xff0c;它彻底改变了…

STM32学习和实践笔记(25):USART(通用同步、异步收发器)

一&#xff0c;STM32的USART简介 USART即通用同步、异步收发器&#xff0c;它能够灵活地与外部设备进行全双工数据交换&#xff0c;满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 UART即通用异步收发器&#xff0c;它是在USART基础上裁剪掉了同步通信功能。 开发板上…

LeetCode 700.二叉搜索树中的搜索

LeetCode 700.二叉搜索树中的搜索 1、题目 题目链接&#xff1a;700. 二叉搜索树中的搜索 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则…

Adobe使用常见问题解答,如何续费?

“Adobe系统状态”页上的颜色表示什么&#xff1f; Gray表示我们调查了潜在的服务中断并确定它没有影响。橙色表示轻微问题。红色表示严重问题。蓝色表示定期维护。绿色表示所有服务均运行正常。 如何查看以前的CSO或CMR&#xff1f; 导航到 https://status.adobe.com.单击所…

智能自助终端主板RK3288/RK3568在酒店前台自助机方案的应用,支持鸿蒙,支持免费定制

酒店前台自助机解决方案是一款基于自助服务终端&#xff0c;能够让客人通过简单的操作完成入住登记/退房的解决方案&#xff0c;大幅提高酒店的工作效率&#xff0c;提升客人体验&#xff0c;降低人力成本。 该方案解决了以下传统前台登记入住方式的痛点&#xff1a; 1、人流量…

MySQL 通过 systemd 启动时 hang 住了……

mysqld&#xff1a;哥&#xff0c;我起不来了…… 作者&#xff1a;贲绍华&#xff0c;爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编…

算法-java

题目来自牛客网 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围&#xff1a; 0≤&#x1d45b;≤10000≤n≤1000&#xff0c;−1000≤节点值≤1000−1000≤节点值≤1000 要求&#xff1a;空间复杂…

佛山市组织开展2024年全市抗震救灾应急演练并召开相关部署会

为深入贯彻落实关于防灾减灾救灾重要论述精神和国家、省、市决策部署,提高佛山市应对地震灾害的抢险救灾实战能力,构建切实可行、快速反应、科学处置的抗震救灾应急救援工作体系,结合第16个全国防灾减灾日宣传主题,5月11日上午,佛山市组织开展2024年全市抗震救灾应急演练并召开…