原文转自 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 自动释放锁(转)的更多相关文章

  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. Linux 文件属性及修改权限

    输入 ll 或 ls -l 命令显示当前目录中文件的属性及文件所属的用户和组 root@user:/home/www# ll test total 880 drwxr-xr-x 2 root root ...

  2. Flask Web开发从入门到放弃(一)

    第1章 章节一 01 内容概要 02 内容回顾 03 路飞学城之加入购物车 04 路飞学城之结算 05 路飞学城之立即支付 06 路飞学城之后续计划 07 Flask框架简介和快速使用 08 FLas ...

  3. (三)宇宙大战 Space Battle -- 场景SCENE切换、UserDefaults统计分数、Particle粒子效果

    此<宇宙大战 Space Battle>SpirteKit手机游戏教程共分为三系列: (一)宇宙大战 Space Battle -- 新建场景Scene.精灵节点.Particle粒子及背 ...

  4. (转)Unreal Networking Guide Created by Zach Metcalf

        2. 3.                                                        

  5. 企业级Nginx Web服务优化实战

    web优化一览总结表 优化类型 优化说明 优化方法 安全优化 隐藏nginx版本信息优化 修改nginx配置文件实现优化 server_tokens off: 修改nginx版本信息优化 修改ngin ...

  6. 【CodeForces】9A-Die Roll

    目录 Question Solution 解法1 解法2 Question 三个人掷骰子,前两个人的得分分别是Y和W,问第三个人胜利的概率(第三个人得分不小于Y.W)?结果输出格式为\(A/B\),如 ...

  7. POJ 3565 Ants(最佳完美匹配)

    Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on ...

  8. Linux SPI总线和设备驱动架构之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  9. ui-grid从后端获取数据后更改数据显示的格式

    从后端获取的数据时是这样的: { "TotalCount":14,"Items": [ { "ProfileId":14, "Na ...

  10. 封装 RabbitMQ.NET

    这篇文章内容会很短,主要是想给大家分享下我最近在做一个简单的rabbitmq客户端类库的封装的经验总结,说是简单其实一点都不简单.为了节省时间我主要按照Library的执行顺序来介绍,在你看来这里仅仅 ...