C++ 多线程:互斥对象 lock_gurad
描述
- 头文件:
<mutex>
- 声明方式:
template< class Mutex > class lock_guard;
- 简介
lock_guard
是一种互斥包装器,它提供了非常便捷的raii资源管控技术用来在对象生存周期内提供互斥锁。
lock_gurad
很好得解决了互斥变量mutex
的锁成员在函数异常期间无法正常回收资源的问题。当lock_guard对象创建之时即尝试获取锁的所有权,当该对象离开其所创建的作用域时会销毁lock_gurad
并释放互斥变量的锁。PS:lock_guard 对象是不可赋值的,它不支持赋值运算符
成员函数
构造函数
std::lock_guard<Mutex>::lock_guard
explicit lock_guard( mutex_type& m ); (1)
lock_guard( mutex_type& m, std::adopt_lock_t t ); (2)
lock_guard( const lock_guard& ) = delete; (3)
获得给定的互斥变量所有权:
(1) 等效于调用m.lock()成员。若m不是递归锁(即传入地址),且当前线程已经占有m,则当前构造是未定义的
(2)获得互斥m的所有权但并不调用lock进行锁定,若当前线程不占有m,则构造是未定义的。
(3)不存在拷贝构造函数
如果m先于lock_guard被销毁,则构造函数未定义析构函数
std::lock_guard<Mutex>::~lock_guard
释放所占有互斥的所有权。
等效地调用 m.unlock() ,其中 m 是传递个 lock_guard 的构造函数的互斥。
使用案例如下:
#include <thread>
#include <mutex>
#include <iostream>int g_i = 0;
std::mutex g_i_mutex; // protects g_ivoid safe_increment()
{std::lock_guard<std::mutex> lock(g_i_mutex);for (int i = 0;i < 10; ++i){++g_i;std::cout << std::this_thread::get_id() << ": " << g_i << '\n';}// 当lock_guard离开当前作用域时mutex互斥量会自动释放
}int main()
{std::cout << "main: " << g_i << '\n';std::thread t1(safe_increment);std::thread t2(safe_increment);t1.join();t2.join();std::cout << "main: " << g_i << '\n';
}
输出如下:
main: 0
0x700004de4000: 1
0x700004de4000: 2
0x700004de4000: 3
0x700004de4000: 4
0x700004de4000: 5
0x700004de4000: 6
0x700004de4000: 7
0x700004de4000: 8
0x700004de4000: 9
0x700004de4000: 10
0x700004e67000: 11
0x700004e67000: 12
0x700004e67000: 13
0x700004e67000: 14
0x700004e67000: 15
0x700004e67000: 16
0x700004e67000: 17
0x700004e67000: 18
0x700004e67000: 19
0x700004e67000: 20
main: 20
总结
lock_guard
提供了自动回收资源的raii技术,能够在对象构造时加锁,析构时解锁,防止因程序异常退出或者忘记unlock造成的死锁问题
C++ 多线程:互斥对象 lock_gurad相关推荐
- 艾伟:C#多线程学习(六) 互斥对象
本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...
- C#多线程学习(六) 互斥对象
C#多线程学习(六) 互斥对象 原文链接:http://kb.cnblogs.com/page/42533/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个 ...
- java迭代器创建后mutx锁,多线程编程(10) - 多线程同步之 Mutex (互斥对象)
原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitForSin ...
- C#多线程学习6——互斥对象
如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...
- 多线程编程(4) - 多线程同步之 Mutex (互斥对象)
原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitForSin ...
- (转)互斥对象锁和临界区锁性能比较 .
在Win32平台上进行多线程编程,常会用到锁.下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用.代码已在VS2005环境下编译测试通过 ...
- 多线程访问共享对象和数据的方式
在多线程访问共享对象和数据时候大致可以分为两大类. 1:如果每个线程执行的代码相同,可以使用同一个runnable对象,这个runnable对象中有那个共享对象.如:买票系统. public clas ...
- jmu-Java-07多线程-互斥访问 (5分)
6-8 jmu-Java-07多线程-互斥访问 (5分) 定义Account类 属性: private int balance 方法: getter方法 void deposit(int money) ...
- java复选框互斥_jmu-Java-07多线程-互斥访问 (5分)
6-8 jmu-Java-07多线程-互斥访问 (5分) 定义Account类 属性: private int balance 方法: getter方法 void deposit(int money) ...
最新文章
- ASP.NET基础教程-SqlConnection对象-使用连接事件
- Cocos2d-x:使用九宫格(九切片)自定义缩放资源
- 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享
- WebApp基础01-设置读取assets目录下文件
- 深入学习二叉树(三) 霍夫曼树
- Java开发找工作最懵圈的问题:到底啥是分布式系统开发经验?
- 版本为2.5的OpenMP规范中的编译制导指令汇总
- 线性代数 矩阵消元与回代
- 在线问诊、找科室、找医生、查疾病、图文问诊、电话急诊、健康咨询、问诊平台、咨询平台、问诊服务、语音问诊、开药问诊、看病平台、在线医疗、健康平台、登录注册、信息架构图、全局说明、组件规范、需求清单、
- CAJ如何转成PDF
- 【收藏】基于Dockerfile搭建JAVA Tomcat运行环境
- 【语音识别】基于matlab DWT算法0~9数字语音识别【含Matlab源码 1726期】
- php 快递100接口
- 计算机组成原理(第3版)思考题与习题答案----唐朔风 编著
- 基于433MHz无线网络和PMS132B SOP14照明驱动方案开发
- project项目管理软件の版本区别?
- ipa图片解密 php,ipa文件详解 - 如何提取App图片
- 计算机子网掩码作用,什么是子网掩码?子网掩码的作用是什么?
- easy-mock使用
- 网易云短信接口调入(java)
热门文章
- oracle数据库连接设置配置文件
- [高中作文赏析]感受冬天
- JDBC连接MySQL数据库及演示样例
- SQL Server 远程无法连接
- Oracle10g客户端远程连接数据库全过程[转]
- ORB_SLAM2帧Frame
- 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测
- ORB_SLAM2代码阅读(4)——LoopClosing线程
- 引入yml依赖包_手把手教你发布 Python 项目开源包
- java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园