unique_lock是一个通用的互迟锁包装类,它允许延迟锁定,限时尝试加锁,递归锁定,锁定所有权的转移以及与条件变量一起使用。

简单地讲,unique_lock 是 lock_guard 的升级加强版,它具有 lock_guard 的所有功能,同时又具有其他很多方法,使用起来更强灵活方便,能够应对更复杂的锁定需要。

特点如下:

  • 创建后默认锁定,和lock_guard一样

  • 创建时可以不锁定(通过指定第二个参数为std::defer_lock),而在需要时再锁定。defer_lock表示延时加锁的意思

  • 可以随时加锁解锁,lock_guard没有提供加解锁的函数。

  • 作用域规则同 lock_grard,析构时自动释放锁

  • 不可复制,可移动

  • 条件变量需要该类型的锁作为参数(此时必须使用unique_lock)

  • try_lock尝试加锁,try_lock_until限时尝试加锁

示例代码:

#include <mutex>
#include <thread>
#include <chrono>struct Box {explicit Box(int num) : num_things{num} {}int num_things;std::mutex m;
};void transfer(Box &from, Box &to, int num)
{// don't actually take the locks yetstd::unique_lock<std::mutex> lock1(from.m, std::defer_lock);std::unique_lock<std::mutex> lock2(to.m, std::defer_lock);// lock both unique_locks without deadlockstd::lock(lock1, lock2);from.num_things -= num;to.num_things += num;// 'from.m' and 'to.m' mutexes unlocked in 'unique_lock' dtors
}int main()
{Box acc1(100);Box acc2(50);std::thread t1(transfer, std::ref(acc1), std::ref(acc2), 10);std::thread t2(transfer, std::ref(acc2), std::ref(acc1), 5);t1.join();t2.join();
}

总结


所有 lock_guard 能够做到的事情,都可以使用 unique_lock 做到,反之则不然。

那么何时使用lock_guard呢?很简单,

需要使用锁的时候,首先考虑使用 lock_guard

它简单、明了、易读。如果用它完全ok,就不要考虑其他了。

如果现实不允许,就让实力派 unique_lock 出马吧!

C++11 锁的加强版封装unique_lock相关推荐

  1. c++11中的lock_guard和unique_lock使用浅析

    锁 锁用来在多线程访问同一个资源时防止数据竞险,保证数据的一致性访问. 多线程本来就是为了提高效率和响应速度,但锁的使用又限制了多线程的并行执行,这会降低效率,但为了保证数据正确,不得不使用锁,它们就 ...

  2. 苹果13系统锁屏延迟_iPhone 11 锁屏出现延迟是怎么回事?

    正常情况下,按下 iPhone 电源键,屏幕会立即息灭,有不少用户反馈按下锁屏键后,会有片刻的延迟才能关屏,虽然延迟并不是很长,但会给人造成"卡顿"的假象.很多人把原因归结为 iO ...

  3. c++11 多线程编程(五)------unique_lock

    互斥锁保证了线程间的同步,但是却将并行操作变成了串行操作,这对性能有很大的影响,所以我们要尽可能的减小锁定的区域,也就是使用细粒度锁. 这一点lock_guard做的不好,不够灵活,lock_guar ...

  4. VUE element-ui之form表单自定义验证11位手机号码(封装验证规则)

    步骤: 封装验证规则: export function isvalidPhone(phone) {const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2 ...

  5. 苹果11锁屏后打开计算机管理,苹果11电源键不能锁屏

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 以iOS13.6.1系统为例,苹果11电源键不能锁屏是因为电源键和音量键之间相隔的距离较近,如果长时间时候使用之后,会导致内部的零 ...

  6. c++ 11 锁_双11好物推荐,这两款好用又实惠的智能锁只需几百块-新闻频道

    随着智能设备种类的增多和安全性的提高,智能锁近两年来正加速推广普及的步伐,越来越多人认可并选择智能锁.一年一度的双11购物节已拉开帷幕,不少朋友计划在这个时候选购好用又实惠的产品,那么对于智能锁产品, ...

  7. c++ 11 锁_国民技术面向智能锁市场提供全系芯片与开源安全解决方案

    全国锁具行业信息中心发布的<2019智能锁行业年度分析报告>显示,2019年智能锁市场总产销量接近1400万套,整个智能锁市场呈大幅上升趋势,质量.安全.便利已成为智能锁市场需求热点. 图 ...

  8. 11.cadence.通孔类封装创建[原创]

    1.打开Pad Designer ---- ----- ---- ---- OK ------- ---- 回到Pad Designer internal:不管是几层板,中间层用这个就可以了: --- ...

  9. Socket编程实践(11) --epoll原理与封装

    常用模型的特点 Linux 下设计并发网络程序,有典型的Apache模型(Process Per Connection,PPC), TPC(Thread Per Connection)模型,以及 se ...

最新文章

  1. 划水是程序员必备的技能吗? | 每日趣闻
  2. C语言中,指针在一个自定义且不带返回值是如何改变外部一些变量的(指针与函数的相互作用)
  3. 在两个静态HTML页面之间传递参数的一个方法
  4. vue饼图组件_vue2.0 自定义 饼状图 (Echarts)组件
  5. Python3中的可变与不可变类型
  6. 交换机的基本原理配置(一)
  7. WSS2.0 服务器启用SQL代理的解决过程
  8. 第 3 章 sqlmap - automatic SQL injection and database takeover tool
  9. 《Java核心技术 卷12》读书笔记
  10. 关于Mac OS的一些想法
  11. 北大核心期刊目录2021年 计算机类
  12. 计算机文件夹加密文件,电脑文件夹怎么加密,制作隐私的加密文件夹软件
  13. 蓝桥杯 历届试题 史丰收速算
  14. 怎么把证件照背景换成蓝色?一键更换照片背景
  15. [CSP-S模拟测试]:砍树(数学+模拟)
  16. IGMP协议(IGMPv1、IGMPv2、IGMPv3)
  17. 【2072】歌手大奖赛
  18. cocoapods的安装
  19. 喷泉设备中的水幕效果
  20. 定义字符串的两种方式

热门文章

  1. 领扣LintCode问题答案-15. 全排列
  2. 将数据导出到文本文件,并从文本文件导入数据
  3. java代码实现龙卷风_Java-使用二叉树实现快速排序-遁地龙卷风
  4. 快客原创 火车头数据采集视频教程——第1讲 ecshop zencart shopex lightinthebox 网店数据批量采集教程
  5. python打开zip文件_如何从Python中的zip文件中读取?
  6. 基于机器学习的个性化推荐算法的研究
  7. Sideloady 下载安装使用教程,将各种的应用程序加载到你的 iPhone、iPad 或 Mac 上
  8. Linux 之父 LinusTorvalds 喊话:Rust 即将出现在 Linux 内核中
  9. Docker——1——Docker的安装/加速器
  10. 如何用python入侵手机_怎么使用Python攻击SQL数据库!