C++11 自动释放锁(转)
原文转自 https://blog.csdn.net/lmb1612977696/article/details/77712170
c++11加入了很多新的特性,值得我们去探索。
先看一个例子:普通的、不能自动的释放自己的锁
- #include <iostream> /*std::cout*/
- #include <thread> /*std::thread*/
- #include <functional> /*std::bind*/
- #include <unistd.h> /*usleep*/
- #include <mutex> /*std::mutex、 std::lock_guard*/
- class Test{
- public:
- Test() : i() {}
- void run1(){
- while(){
- Fun1();
- usleep();
- }
- }
- void run2(){
- while(){
- Fun2();
- usleep();
- }
- }
- void Fun1(){
- mutex.lock();
- std::cout << "Fun1->" << i++ <<std::endl;
- mutex.unlock();
- }
- void Fun2(){
- mutex.lock();
- std::cout << "Fun2->" << i++ <<std::endl;
- mutex.unlock();
- }
- private:
- int i;
- std::mutex mutex;
- };
- int main(int argc, char *argv[]) {
- Test test;
- std::thread t1(std::bind(&Test::run1,&test));
- std::thread t2(std::bind(&Test::run2,&test));
- t1.join();
- t2.join();
- return ;
- }
借助对象的析构函数自动调用的原理,c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁。最终的结果就是:在定义该局部对象的时候加锁(调用构造函数),出了该对象作用域的时候解锁(调用析构函数)。
- #include <iostream> /*std::cout*/
- #include <thread> /*std::thread*/
- #include <functional> /*std::bind*/
- #include <unistd.h> /*usleep*/
- #include <mutex> /*std::mutex、 std::lock_guard*/
- class Test{
- public:
- Test() : i() {}
- void run1(){
- while(){
- Fun1();
- usleep();
- }
- }
- void run2(){
- while(){
- Fun2();
- usleep();
- }
- }
- void Fun1(){
- std::lock_guard<std::mutex> lock(mutex);
- std::cout << "Fun1->" << i++ <<std::endl;
- }
- void Fun2(){
- std::lock_guard<std::mutex> lock(mutex);
- std::cout << "Fun2->" << i++ <<std::endl;
- }
- private:
- int i;
- std::mutex mutex;
- };
- int main(int argc, char *argv[]) {
- Test test;
- std::thread t1(std::bind(&Test::run1,&test));
- std::thread t2(std::bind(&Test::run2,&test));
- t1.join();
- t2.join();
- return ;
- }
如果想对C++锁进行进一步的研究,请参考 https://www.cnblogs.com/diegodu/p/7099300.html
C++11 自动释放锁(转)的更多相关文章
- Python 线程,with的作用(自动获取和释放锁Lock)
Python 线程,with的作用(自动获取和释放锁Lock) import threading import time num= #全局变量多个线程可以读写,传递数据 mutex=threading ...
- 任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行
任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行 多线程 - 廖雪峰的官方网站 https://www.liaoxuefeng ...
- OC中对象元素的引用计数 自动释放池的相关概念
OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc] view plaincopy 1. // 2. / ...
- 释放锁标记只有在Synchronized代码结束或者调用wait()。
释放锁标记只有在Synchronized代码结束或者调用wait(). 注意锁标记是自己不会自动释放,必须有通知. 注意在程序中判定一个条件是否成立时要注意使用WHILE要比使用IF要严密. WHIL ...
- Qt窗口及控件-窗口Close()自动释放
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt-窗口Close()后自动释放空间 本文地址:http://techieliang ...
- 09_传智播客iOS视频教程_自动释放池与NSLog函数
不要管什么是自动释放池,现在给你讲你也听不懂.就业班才讲,不要知道太多,知道太多对你不好.电影里面死的最惨的人就是知道最多的人.把代码写到自动释放池里面就可以了.NSLog是printf的增强版,它增 ...
- 面试 LockSupport.park()会释放锁资源吗?
(手机横屏看源码更方便) 引子 大家知道,我最近在招人,今天遇到个同学,他的源码看过一些,然后我就开始了AQS连环问. 我:说说AQS的大致流程? 他:AQS包含一个状态变量,一个同步队列--bala ...
- 63 (OC)* NSAutoreleasePool 自动释放池
目录 0:ARC 1: 自动释放池 2:NSAutoreleasePool实现原理 3:autorelease 方法 4: Runloop和Autorelease的关系 5: Using Autore ...
- 如何证明sleep不释放锁,而wait释放锁?
wait 加锁示例 public class WaitDemo { private static Object locker = new Object(); public static void ma ...
随机推荐
- 【Luogu P4644】Cleaning Shifts
题目 给定 \(n\) 个区间 \([a_i, b_i]\), 花费为 \(c_i\), 求覆盖 \([L, R]\) 区间的所有整数的最小花费. \(0\le n \le 10^4, 0\le L, ...
- springmvc基础篇—修改默认的配置文件名称及位置
springmvc的默认配置文件是放在WEB-INF下的,叫action-servlet.xml.根据咱们编程的习惯,一般都将配置文件放到src的根目录下,那么如何将这个文件迁移过来呢?其实很简单,请 ...
- js面向对象过程
var a = new b(); 等价于 var a={}; a=b.prototype; b.call(a);
- 免费天气预报API接口
一.中国气象局(http://www.weather.com.cn) 1.实时接口 http://mobile.weather.com.cn/data/sk/101010100.html http:/ ...
- 第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数
函数的定义:函数是为了完成某一特定功能的,函数是逻辑结构化和过程化的一种编程方法 函数的定义格式,函数一般都是有返回值的 #语法 #函数名要能反映其意义 def 函数名(参数1,参数2,参数3,... ...
- 文件特殊权限:SUID,SGID,SBIT
我们之前认识的文件的权限仅局限于r,w,x,但如果我们执行命令“ll /tmp; ll /usr/bin/passwd”,会出现除了r,w,x之外的其他字母: 即出现了特殊权限(s跟t). [SetU ...
- lintcode-103-带环链表 II
带环链表 II 给定一个链表,如果链表中存在环,则返回到链表中环的起始节点的值,如果没有环,返回null. 样例 给出 -21->10->4->5, tail connects to ...
- lintcode-47-主元素 II
47-主元素 II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 注意事项 数组中只有唯一的主元素 样例 给出数组[1,2,1,2,1,3,3] 返回 1 挑战 ...
- Top K 算法详解
http://xingyunbaijunwei.blog.163.com/blog/static/7653806720111149318357/ 问题描述 百度面试题: ...
- WCF身份验证一:消息安全模式之<Certificate>身份验证
消息安全模式的证书身份验证方式,基于WSHttpBinding绑定协议的实现过程.主要内容:基本概念,然后是制作证书.服务端配置.客户端配置.总结.这里应该和Transport传输安全模式之证书身份验 ...