描述

  • 头文件:<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相关推荐

  1. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  2. C#多线程学习(六) 互斥对象

    C#多线程学习(六) 互斥对象 原文链接:http://kb.cnblogs.com/page/42533/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个 ...

  3. java迭代器创建后mutx锁,多线程编程(10) - 多线程同步之 Mutex (互斥对象)

    原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitForSin ...

  4. C#多线程学习6——互斥对象

    如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...

  5. 多线程编程(4) - 多线程同步之 Mutex (互斥对象)

    原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitForSin ...

  6. (转)互斥对象锁和临界区锁性能比较 .

    在Win32平台上进行多线程编程,常会用到锁.下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用.代码已在VS2005环境下编译测试通过 ...

  7. 多线程访问共享对象和数据的方式

    在多线程访问共享对象和数据时候大致可以分为两大类. 1:如果每个线程执行的代码相同,可以使用同一个runnable对象,这个runnable对象中有那个共享对象.如:买票系统. public clas ...

  8. jmu-Java-07多线程-互斥访问 (5分)

    6-8 jmu-Java-07多线程-互斥访问 (5分) 定义Account类 属性: private int balance 方法: getter方法 void deposit(int money) ...

  9. java复选框互斥_jmu-Java-07多线程-互斥访问 (5分)

    6-8 jmu-Java-07多线程-互斥访问 (5分) 定义Account类 属性: private int balance 方法: getter方法 void deposit(int money) ...

最新文章

  1. ASP.NET基础教程-SqlConnection对象-使用连接事件
  2. Cocos2d-x:使用九宫格(九切片)自定义缩放资源
  3. 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享
  4. WebApp基础01-设置读取assets目录下文件
  5. 深入学习二叉树(三) 霍夫曼树
  6. Java开发找工作最懵圈的问题:到底啥是分布式系统开发经验?
  7. 版本为2.5的OpenMP规范中的编译制导指令汇总
  8. 线性代数 矩阵消元与回代
  9. 在线问诊、找科室、找医生、查疾病、图文问诊、电话急诊、健康咨询、问诊平台、咨询平台、问诊服务、语音问诊、开药问诊、看病平台、在线医疗、健康平台、登录注册、信息架构图、全局说明、组件规范、需求清单、
  10. CAJ如何转成PDF
  11. 【收藏】基于Dockerfile搭建JAVA Tomcat运行环境
  12. 【语音识别】基于matlab DWT算法0~9数字语音识别【含Matlab源码 1726期】
  13. php 快递100接口
  14. 计算机组成原理(第3版)思考题与习题答案----唐朔风 编著
  15. 基于433MHz无线网络和PMS132B SOP14照明驱动方案开发
  16. project项目管理软件の版本区别?
  17. ipa图片解密 php,ipa文件详解 - 如何提取App图片
  18. 计算机子网掩码作用,什么是子网掩码?子网掩码的作用是什么?
  19. easy-mock使用
  20. 网易云短信接口调入(java)

热门文章

  1. oracle数据库连接设置配置文件
  2. [高中作文赏析]感受冬天
  3. JDBC连接MySQL数据库及演示样例
  4. SQL Server 远程无法连接
  5. Oracle10g客户端远程连接数据库全过程[转]
  6. ORB_SLAM2帧Frame
  7. 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测
  8. ORB_SLAM2代码阅读(4)——LoopClosing线程
  9. 引入yml依赖包_手把手教你发布 Python 项目开源包
  10. java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园