原文转自 https://blog.csdn.net/lmb1612977696/article/details/77712170

c++11加入了很多新的特性,值得我们去探索。

先看一个例子:普通的、不能自动的释放自己的锁

  1. #include <iostream> /*std::cout*/
  2. #include <thread> /*std::thread*/
  3. #include <functional> /*std::bind*/
  4. #include <unistd.h> /*usleep*/
  5. #include <mutex> /*std::mutex、 std::lock_guard*/
  6. class Test{
  7. public:
  8. Test() : i() {}
  9. void run1(){
  10. while(){
  11. Fun1();
  12. usleep();
  13. }
  14. }
  15. void run2(){
  16. while(){
  17. Fun2();
  18. usleep();
  19. }
  20. }
  21. void Fun1(){
  22. mutex.lock();
  23. std::cout << "Fun1->" << i++ <<std::endl;
  24. mutex.unlock();
  25. }
  26. void Fun2(){
  27. mutex.lock();
  28. std::cout << "Fun2->" << i++ <<std::endl;
  29. mutex.unlock();
  30. }
  31. private:
  32. int i;
  33. std::mutex mutex;
  34. };
  35. int main(int argc, char *argv[]) {
  36. Test test;
  37. std::thread t1(std::bind(&Test::run1,&test));
  38. std::thread t2(std::bind(&Test::run2,&test));
  39. t1.join();
  40. t2.join();
  41. return ;
  42. }

借助对象的析构函数自动调用的原理,c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁。最终的结果就是:在定义该局部对象的时候加锁(调用构造函数),出了该对象作用域的时候解锁(调用析构函数)。

  1. #include <iostream> /*std::cout*/
  2. #include <thread> /*std::thread*/
  3. #include <functional> /*std::bind*/
  4. #include <unistd.h> /*usleep*/
  5. #include <mutex> /*std::mutex、 std::lock_guard*/
  6. class Test{
  7. public:
  8. Test() : i() {}
  9. void run1(){
  10. while(){
  11. Fun1();
  12. usleep();
  13. }
  14. }
  15. void run2(){
  16. while(){
  17. Fun2();
  18. usleep();
  19. }
  20. }
  21. void Fun1(){
  22. std::lock_guard<std::mutex> lock(mutex);
  23. std::cout << "Fun1->" << i++ <<std::endl;
  24. }
  25. void Fun2(){
  26. std::lock_guard<std::mutex> lock(mutex);
  27. std::cout << "Fun2->" << i++ <<std::endl;
  28. }
  29. private:
  30. int i;
  31. std::mutex mutex;
  32. };
  33. int main(int argc, char *argv[]) {
  34. Test test;
  35. std::thread t1(std::bind(&Test::run1,&test));
  36. std::thread t2(std::bind(&Test::run2,&test));
  37. t1.join();
  38. t2.join();
  39. return ;
  40. }

如果想对C++锁进行进一步的研究,请参考 https://www.cnblogs.com/diegodu/p/7099300.html

C++11 自动释放锁(转)的更多相关文章

  1. Python 线程,with的作用(自动获取和释放锁Lock)

    Python 线程,with的作用(自动获取和释放锁Lock) import threading import time num= #全局变量多个线程可以读写,传递数据 mutex=threading ...

  2. 任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行

    任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行 多线程 - 廖雪峰的官方网站 https://www.liaoxuefeng ...

  3. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  4. 释放锁标记只有在Synchronized代码结束或者调用wait()。

    释放锁标记只有在Synchronized代码结束或者调用wait(). 注意锁标记是自己不会自动释放,必须有通知. 注意在程序中判定一个条件是否成立时要注意使用WHILE要比使用IF要严密. WHIL ...

  5. Qt窗口及控件-窗口Close()自动释放

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt-窗口Close()后自动释放空间     本文地址:http://techieliang ...

  6. 09_传智播客iOS视频教程_自动释放池与NSLog函数

    不要管什么是自动释放池,现在给你讲你也听不懂.就业班才讲,不要知道太多,知道太多对你不好.电影里面死的最惨的人就是知道最多的人.把代码写到自动释放池里面就可以了.NSLog是printf的增强版,它增 ...

  7. 面试 LockSupport.park()会释放锁资源吗?

    (手机横屏看源码更方便) 引子 大家知道,我最近在招人,今天遇到个同学,他的源码看过一些,然后我就开始了AQS连环问. 我:说说AQS的大致流程? 他:AQS包含一个状态变量,一个同步队列--bala ...

  8. 63 (OC)* NSAutoreleasePool 自动释放池

    目录 0:ARC 1: 自动释放池 2:NSAutoreleasePool实现原理 3:autorelease 方法 4: Runloop和Autorelease的关系 5: Using Autore ...

  9. 如何证明sleep不释放锁,而wait释放锁?

    wait 加锁示例 public class WaitDemo { private static Object locker = new Object(); public static void ma ...

随机推荐

  1. 【Luogu P4644】Cleaning Shifts

    题目 给定 \(n\) 个区间 \([a_i, b_i]\), 花费为 \(c_i\), 求覆盖 \([L, R]\) 区间的所有整数的最小花费. \(0\le n \le 10^4, 0\le L, ...

  2. springmvc基础篇—修改默认的配置文件名称及位置

    springmvc的默认配置文件是放在WEB-INF下的,叫action-servlet.xml.根据咱们编程的习惯,一般都将配置文件放到src的根目录下,那么如何将这个文件迁移过来呢?其实很简单,请 ...

  3. js面向对象过程

    var a = new  b(); 等价于 var a={}; a=b.prototype; b.call(a);

  4. 免费天气预报API接口

    一.中国气象局(http://www.weather.com.cn) 1.实时接口 http://mobile.weather.com.cn/data/sk/101010100.html http:/ ...

  5. 第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数

    函数的定义:函数是为了完成某一特定功能的,函数是逻辑结构化和过程化的一种编程方法 函数的定义格式,函数一般都是有返回值的 #语法 #函数名要能反映其意义 def 函数名(参数1,参数2,参数3,... ...

  6. 文件特殊权限:SUID,SGID,SBIT

    我们之前认识的文件的权限仅局限于r,w,x,但如果我们执行命令“ll /tmp; ll /usr/bin/passwd”,会出现除了r,w,x之外的其他字母: 即出现了特殊权限(s跟t). [SetU ...

  7. lintcode-103-带环链表 II

    带环链表 II 给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null. 样例 给出 -21->10->4->5, tail connects to ...

  8. lintcode-47-主元素 II

    47-主元素 II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 注意事项 数组中只有唯一的主元素 样例 给出数组[1,2,1,2,1,3,3] 返回 1 挑战 ...

  9. Top K 算法详解

    http://xingyunbaijunwei.blog.163.com/blog/static/7653806720111149318357/ 问题描述         百度面试题:        ...

  10. WCF身份验证一:消息安全模式之<Certificate>身份验证

    消息安全模式的证书身份验证方式,基于WSHttpBinding绑定协议的实现过程.主要内容:基本概念,然后是制作证书.服务端配置.客户端配置.总结.这里应该和Transport传输安全模式之证书身份验 ...