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 ...
随机推荐
- ubuntu 把软件源修改为国内源
国内有很多Ubuntu的镜像源,比如:阿里源.网易源等,还有很多教育网的源,比如:清华源.中科大源等. 这里以清华源为例讲解如何修改Ubuntu 18.04里面默认的源. 修改步骤 第一步:备份原始源 ...
- MySQL☞dual虚拟表
Dual表:虚拟表,专门用来测试各种函数:(本来以为跟Oracle中的dual表一样,发现还是不太一样)
- Dijkstra标准模板
Dijkstra求最短路问题:单元求最短路,从任意点出发求得该点到达其他任意点的距离 Dijkstra其实是一种贪心策略,与出发点(即源点)所连接的点中找到距离最短的点(这个距离是源点到这个点的最短距 ...
- Week2 Teamework from Z.XML 软件分析与用户需求调查(四)Bing桌面及助手的现状与发展
一.Bing搜索的相关背景 第一,必应搜索前几年的发展重点在于欧美市场,并且取得了一定的成效:根据 Hitwise 的统计数据,Bing 在 2011年3 月份市场占有率突破了 30% 大关,达到 3 ...
- JavaSE复习(四)File类与IO流
File类 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例. public File(String parent ...
- Coursera: Internet History, Technology, and Security
课程网址:https://www.coursera.org/learn/internet-history 学习笔记: Week 1: History - Dawn of Early Computing ...
- Sql Express数据备份和还原
参考文章:在SQL Server Express版本中没有代理功能如何自动备份数据库 首先用以下脚本,生成可以自动备份数据库的存储过程: USE [master] GO SET ANSI_NULLS ...
- js表单验证工具包
常用的js表单验证方法大全 /* 非空校验 : isNull() 是否是数字: isNumber(field) trim函数: trim() lTrim() rTrim() 校验字符串是否为空: ch ...
- JavaScript页面跳转
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding=& ...
- Visual Source Safe的使用方法
VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目.管理软件开发中各 ...