首页 > 其他分享 >std::lock_guard 介绍

std::lock_guard 介绍

时间:2024-03-24 22:56:03浏览次数:20  
标签:std 对象 lock guard mutex Mutex

std::lock_gurad 是 C++11 中定义的模板类。定义如下:

template <class Mutex> class lock_guard;

lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。

模板参数 Mutex 代表互斥量类型,例如 std::mutex 类型,它应该是一个基本的 BasicLockable 类型,标准库中定义几种基本的 BasicLockable 类型,分别是:

  • std::mutex
  • std::recursive_mutex
  • std::timed_mutex
  • std::recursive_timed_mutex

(注:BasicLockable 类型的对象只需满足两种操作,lock 和 unlock,另外还有 Lockable 类型,在 BasicLockable 类型的基础上新增了 try_lock 操作,因此一个满足 Lockable 的对象应支持三种操作:lock,unlock 和 try_lock;最后还有一种 TimedLockable 对象,在 Lockable 类型的基础上又新增了 try_lock_for try_lock_until 两种操作,因此一个满足 TimedLockable 的对象应支持五种操作:lock, unlock, try_lock, try_lock_for, try_lock_until)。

lock_guard 对象构造时,传入的 Mutex 对象(即它所管理的 Mutex 对象)会被当前线程锁住。在lock_guard 对象被析构时,它所管理的 Mutex 对象会自动解锁,由于不需要程序员手动调用 lock 和 unlock 对 Mutex 进行上锁和解锁操作,因此这也是最简单安全的上锁和解锁方式,尤其是在程序抛出异常后先前已被上锁的 Mutex 对象可以正确进行解锁操作,极大地简化了程序员编写与 Mutex 相关的异常处理代码。

值得注意的是,lock_guard 对象并不负责管理 Mutex 对象的生命周期,lock_guard 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。

lock_guard 构造函数如下表所示:

locking (1)
explicit lock_guard (mutex_type& m);

lock_guard 对象管理 Mutex 对象 m,并在构造时对 m 进行上锁(调用 m.lock())。


adopting (2)
lock_guard (mutex_type& m, adopt_lock_t tag);

lock_guard 对象管理 Mutex 对象 m,与 locking 初始化(1) 不同的是, Mutex 对象 m 已被当前线程锁住。

copy [deleted](3)
lock_guard (const lock_guard&) = delete;

lock_guard 对象的拷贝构造和移动构造(move construction)均被禁用,因此 lock_guard 对象不可被拷贝构造或移动构造。

 adopt_mutex:“收养锁”- 先上锁,然后托管给lock_guard这个类,之后如果发生了异常阿也不需要没有解锁而产生死锁的现象。

void test() {//std::adopt_mutex的大妙处
	test_mutex.lock();
	lock_guard<std::mutex> lg(test_mutex, std::adopt_lock);
	//在这里进行收养锁
	cout << "hello test" << endl;
}
void test(int) {//test的配套练习
	test_mutex.lock();
	cout << "hello test(int)" << endl;
	test_mutex.unlock();
}

 

标签:std,对象,lock,guard,mutex,Mutex
From: https://www.cnblogs.com/love-9/p/18093283

相关文章

  • YoloV8改进策略:Block改进|ECA-Net:用于深度卷积神经网络的高效通道注意力|ECA+压缩膨胀
    摘要arxiv.org/pdf/1910.03151.pdf最近,通道注意机制已被证明在改善深度卷积神经网络(CNN)的性能方面具有巨大潜力。然而,大多数现有方法致力于开发更复杂的注意模块以实现更好的性能,这不可避免地会增加模型的复杂性。为了克服性能和复杂性折衷之间的矛盾,本文提出了一种有效......
  • Code Block下载安装-运行Hello world!
     一、官网下载Code::Blocksdownload|SourceForge.net直接点击Download二、安装1.Next2.IAgree3.Next4.选择安装位置三、新建一个模版1.New->Newfromtemplate2.我这里新建一个C++项目3.Finish4.运行不成功5.可能是编译器路径不对,查看一下  Set......
  • 大模型推理框架 vLLM 源码解析(二):Block 模块分配和管理
    1.Block概览vLLM的一个很大创新点是将物理层面的GPU和CPU可用内存切分成若干个block,这样可以有效降低内存碎片化问题。具体而言,vLLM的block分为逻辑层面(logical)和物理层面(physical),二者之间存在映射关系。下图很好解释了两个层面block的关系。假设每个block可以......
  • std::vector 和 std::list 区别
    std::vector和std::list区别?std::vector和std::list是C++标准库中两种不同的容器类型,它们之间有以下几个主要区别:存储结构:std::vector是连续内存空间上的动态数组,元素在内存中是连续存储的。std::list是基于双向链表实现的,元素在内存中是非连续存储的。......
  • 自己编译RustDesk,并将自建ID服务器和key信息写入客户端
    前言:搭建RustDesk编译环境    今天总算是把编译环境给折腾清楚了,编译出来了至少能用,但说不上好用,问题还不少,官方的客户端就是要手工填写ID服务器地址和key才可以用,而且还容易被别人白嫖你搭建的服务器,当然如果拿到你编译后的客户端,也是存在被白嫖的可能。这方面还没......
  • Golang: Redislock源码分析
    Golang:Redislock源码分析源码https://github.com/bsm/redislock实现Lua脚本obtain.lua--obtain.lua:arguments=>[value,tokenLen,ttl]--Obtain.luatrytosetprovidedkeys'swithvalueandttliftheydonotexists.--Keyscanbeoverrideniftheyal......
  • 如何用pytorch调用预训练Swin Transformer中的一个Swin block模块
    1,首先,我们需要知道的是,想要调用预训练的SwinTransformer模型,必须要安装pytorch2,因为pytorch1对应的torchvision中不包含SwinTransformer。2,pytorch2调用预训练模型时,不建议使用pretrained=True,这个用法即将淘汰,会报警告。最好用如下方式:fromtorchvision.models.swin_trans......
  • Oracle Data Guard Gap日志间隙SCN增量备份恢复案例分享
            本期将为大家分享”OracleDataGuardGap日志间隙SCN增量备份恢复”案例。        欢迎关注“数据库运维之道”公众号,一起学习数据库技术!        关键字:DataGuard日志间隙、RedoGap、ArchiveGap、DataGuardGap、ORA-00308、ORA-2703......
  • VMware ESXi 8.0U1d macOS Unlocker & OEM BIOS 标准版和厂商定制版
    VMwareESXi8.0U1dmacOSUnlocker&OEMBIOS标准版和厂商定制版ESXi8.0U1标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)OEM定制版请访问原文链接:https://sysin.org/blog/vmware-esx......
  • WPF TextBlock根据值显示不同的内容或格式
    当TextBlock绑定的值IsChek=1时显示为“是”;IsCheck=2时显示为“否”,同时设置文字颜色为红色<TextBlockFontWeight="Bold"VerticalAlignment="Center"><TextBlock.Style><StyleTargetType="TextBlock"><Style.Tr......