当前位置: 首页 > article >正文

关于多线程unique_lock和guard_lock

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、
    • 2.1
    • 2.2
  • 总结

前言

前期疑问:
本文目标:


一、背景

今天看编程规范还看到关于unique_ptr的用法,然后想起之前写多线程一直疑惑的一个点,但是今天查了下,发现当时疑惑的不是unique_ptr而是unique_lock。所以现在就迎来了这篇文章的主角。unique_lock

编程规范中首先表述了不要直接使用mutex线程锁。原话是:不要直接调用mutex的方法。

std::mutex以及std::shared_mutex等锁对象提供lock()和unlock()方法来进行加锁和解锁。但是,直接调用这两个方法很容易造成执行不到unlock的错误。

应该使用用std::lock_guard 、std::unique_lock 等机制,确保以任何形式(正常执行完、中途break、continue、返回、抛
异常等)离开作用域时都会自动调用unlock() 解锁。

至于这里的std::lock_guard 、std::unique_lock有啥区别以及std::mutex、std::shared_mutex有啥区别暂时搁置不议,先了解下为什么要使用std::lock_guard 、std::unique_lock而不要直接调用mutex的方法。

二、为什么不要直接使用mutex

2.1

下面举了两个例子

Data* data = nullptr;
std::mutex dataMutex;
Data& GetData()
{
	dataMutex.lock();
	if (data != nullptr) {
		return *data; // 忘记unlock
	}
	data = CreateData(); // 如果这里抛异常,也无法unlock
	dataMutex.unlock();
	return *data;
}

上面的代码会存在互斥锁dataMutex没有释放的情况,下面是修正后的例子

Data* data = nullptr;
std::mutex dataMutex;
Data& GetData()
{
    std::lock_guard<std::mutex> lock(dataMutex);
    if (data != nullptr) {
    	return *data; 			// return时lock析构,自动unlock
    }
    data = CreateData(); 		 // 如果这里抛异常(只要能被catch)也会使lock析构,自动unlock
    return *data; 				// return时lock析构,自动unlock
}

上面解决了为什么不要直接使用互斥锁。下面就是几种对象之间的区别了。

三、

3.1


总结

未完待续


http://www.kler.cn/a/290424.html

相关文章:

  • Prompt 工程
  • 如何理解DDoS安全防护在企业安全防护中的作用
  • Docker网络和overlay的基础讲解
  • 【Xrdp联机Ubuntu20.04实用知识点补充】
  • 2024年11月10日系统架构设计师考试题目回顾
  • vscode Markdown
  • 冒泡排序及qsort函数
  • P1505 [国家集训队] 旅游
  • 【C++深入学习】日期类函数从无到有实现
  • day-49 使数组中所有元素相等的最小操作数
  • glsl着色器学习(三)
  • 随时随地远程启动家里设备,极空间部署一键网络唤醒工具『UpSnap』
  • C++ 消息分发类:详细示例应用
  • Python 数据分析笔记— Numpy 基本操作(上)
  • zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存
  • 【MySql】面试问答:在使用mysql时,遇到分页查询慢的情况怎么处理?
  • 观测云核心技术解密:eBPF Tracing 实现原理
  • Java项目:137 springboot基于springboot的智能家居系统
  • 1. 深度学习基础:从神经网络到深度学习
  • CSS系列之浮动清除clear(三)
  • ztree搜索结果高亮变颜色(非highlight属性)
  • upload文件上传靶场
  • 在react中用three.js 渲染模型 在上面创建标签
  • 传统CV算法——基于opencv的答题卡识别判卷系统
  • 【大数据】Java与Python的无缝对接:探讨Java调用Python的方法与原理
  • <数据集>车辆识别数据集<目标检测>