首页 > 编程语言 >C++-unique_lock与lock_guard区别

C++-unique_lock与lock_guard区别

时间:2023-04-11 21:24:29浏览次数:60  
标签:std lock 解锁 guard mutex unique

C++-unique_lock与lock_guard区别

https://blog.csdn.net/ccw_922/article/details/124662275
https://blog.csdn.net/sinat_35945236/article/details/124505414

都可以对std::mutex进行封装,实现RAII的效果。绝大多数情况下这两种锁是可以互相替代的,区别是unique_lock比lock_guard能提供更多的功能特性(但需要付出性能的一些代价)

使用方式

  • lock_guard:
    lock_guard 通常用来管理一个 std::mutex 类型的对象,通过定义一个 lock_guard 一个对象来管理 std::mutex 的上锁和解锁。
    (1) 创建即加锁,作用域结束自动析构并解锁,无需手工解锁
    (2) 不能中途解锁,必须等作用域结束才解锁
    (3) 不能复制
    注意:
    lock_guard 并不管理 std::mutex 对象的声明周期,也就是说在使用 lock_guard 的过程中,如果 std::mutex 的对象被释放了,那么在 lock_guard 析构的时候进行解锁就会出现空指针错误。

  • unique_lock:
    创建时可以不锁定(通过指定第二个参数为 std::defer_lock),而在需要时再锁定
    可以随时加锁解锁
    作用域规则同 lock_grard,析构时自动释放锁
    不可复制,可移动

赋值操作

unique_lock和lock_guard都不能复制
lock_guard不能移动,但是unique_lock可以移动。

// unique_lock 可以移动,不能复制
std::unique_lock<std::mutex> guard1(_mu);
std::unique_lock<std::mutex> guard2 = guard1;  // error
std::unique_lock<std::mutex> guard2 = std::move(guard1); // ok

// lock_guard 不能移动,不能复制
std::lock_guard<std::mutex> guard1(_mu);
std::lock_guard<std::mutex> guard2 = guard1;  // error
std::lock_guard<std::mutex> guard2 = std::move(guard1); // error

资源消耗

  • unique_lock更加灵活,因为它要维持mutex的状态,但也因此对于资源的消耗明显要大一些,同时效率也比lock_guard更低一点。
  • lock_guard虽然笨重一些,但是资源消耗相对要小一点。

另外,unique_lock还在条件变量的使用时发挥作用

标签:std,lock,解锁,guard,mutex,unique
From: https://www.cnblogs.com/yongchao/p/17307789.html

相关文章

  • “JUC锁”02之 互斥锁ReentrantLock
    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLock示例在后面的两章,会分别介绍ReentrantLock的两个子类(公平锁和非公平锁)的实现原理。转载请注明出处:http://www.cnblogs.com/skywang123......
  • 【Java 并发】【十】【JUC数据结构】【三】LinkedBlockingQueue阻塞队列原理
    1 前言这节我们就来看看LinkedBlockingQueue内部实现的原理。2 LinkedBlockingQueue的使用在看原理之前我们先来用一用LinkedBlockingQueue,来体验一下:2.1  插入数据publicclassLinkedBlockingQueueTest{publicstaticvoidmain(String[]args)throwsInter......
  • BlockingQueue读取文本内容,多线程处理数据(线程池版本)
    importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.concurrent.*;publicclassceshi2{publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionExcept......
  • BlockingQueue读取文本内容,多线程处理数据
    现在有一个txt文本,每个文本中每行的内容是:id,商品id。要求:启动一个线程去读取文本的内容,把每行的内容通过使用BlockingQueue发送到队列里面,然后多线程,最好是10个线程,从BlockingQueue队列里面取出来,将地址作为请求参数,请求api接口,把返回的内容解析出来,把原内容id,商品id,结果集......
  • ORA-01578: ORACLE data block corrupted
    环境:LINUX 6.5+EBSR12.2.0(数据库:11G (11.2.0.3))1、数据库启动失败。 ORA-00604:erroroccurredatrecursiveSQLlevel1ORA-01578:ORACLEdatablockcorrupted(file#5,block#96539)ORA-01110:datafile5:‘/u1/ebs/db/PROD/data/system05.dbf’  ......
  • Day02 - JavaScript + CSS Clock
    Day02-JavaScript+CSSClock作者:©liyuechun简介第二天的练习是用JS+CSS模拟时钟效果。效果如下:实现以上模拟时钟的效果,大致思路和解决方案如下:分别获取到当前时间的时、分、秒。通过时分秒对一圈360度,进行映射,确定每一个指针所需旋转的角度。通过CSS的transform:rotate(deg),......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock之ReadLock读锁原理
    1 前言上节我们看了下ReentrantReadWriteLock读写锁的写锁的申请和释放过程,这节我们就来看下读锁的。2 线程读锁记录回顾一下之前的例子,在读写并发操作的时候,读取数据的时候加读锁:publicclassReentrantReadWriteLockTest{//声明一个读写锁privatestaticR......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock 读写锁怎么表示
    1 前言接下来我们来看看ReentrantReadWriteLock读写锁,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类,这个锁很重要,在很多开源的中间件中使用的非常广泛,很多场景使用它来减少并发操作中的锁冲突,提升并发能力。2  ReentrantReadWriteLock介绍ReentrantRead......
  • 极值分析:分块极大值BLOCK-MAXIMA、阈值超额法、广义帕累托分布GPD拟合降雨数据时间序
    全文链接:http://tecdat.cn/?p=25348最近我们被客户要求撰写关于极值分析的研究报告,包括一些图形和统计输出。你们可能知道,实际极值分析有两种常用方法:分块极大值Block-maxima、阈值超额法thresholdexcess今天,我们将分别介绍这两种方法。分块极大值Block-maxima分块样本极大......
  • JUC并发编程第十四章之StampedLock(读写锁的优化实践)
    JUC并发编程学习路线JUC并发编程第一章之进程/并发/异步的概念[理解基本概念]JUC并发编程第二章之CompletableFuture[加强版的线程]JUC并发编程第三章之Synchronized八锁案例[理解锁的对象]JUC并发编程第四章之公平锁/重入锁/死锁[常见锁的基本认识]JUC并发编程第五章之线程......