RAII 想到AutoLock,Mutex类和C++11中的unique_lock

C++11互斥量mutex详解,再也不怕多线程的数据竞争! mutex又称互斥量,C++ 11中与 mutex相关的类(包括锁类型)和函数都声明在头文件中,所以如果你需要使用 std::mutex,就必须包含头文件。std::mutex,独占的互斥量,不能递归使用。std::time_mutex,带超时的独占互斥量,不能递归使用。std::recursive_mutex,递归互斥量,不带超时功能。std::recursive_timed_mutex,带超时的递归互斥量。 阅读详情
RAII(Resource Acquisition Is Initialization)其定义直接引用The C++ Programming Language 4th Edition
“The technique of acquiring resources in a constructor and  releasing them in a destructor, known as Resource Acquisition Is  Initialization or RAII”

    我浅显的理解就是资源的获取(锁,数据库链接,文件等)和释放分别在构造函数和析构函数中实现。由此想到了之前的一篇文章C++简洁实现线程安全单例类里面的两个类:AutoLock和Mutex,它们就是典型的RAII类,Mutex的构造函数中init了一个mutex,析构函数中则destroy了它,AutoLock在构造函数中获得了一个mutex,在析构函数中则释放了它,看代码就了然。

#define DISABLE_COPY_AND_ASSIGN(T) \  
        T(const T &); \  
        T& operator=(const T &)  
struct Recursive {};
class Mutex {  
public:  
    Mutex() {  
        pthread_mutex_init(&_mutex, NULL);  
    }  
    explicit Mutex(Recursive) {
        pthread_mutexattr_t attr;
        pthread_mutexattr_init(&attr);
        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
        pthread_mutex_init(&_mutex, &attr);
        pthread_mutexattr_destroy(&attr);
    }
    ~Mutex() {  
        pthread_mutex_destroy(&_mutex);  
    }  
      
    int lock() {  
        return pthread_mutex_lock(&_mutex);  
    }  
      
    int trylock() {  
        return pthread_mutex_trylock(&_mutex);  
    }  
      
    int unlock() {  
        return pthread_mutex_unlock(&_mutex);  
    }  
      
private:  
    pthread_mutex_t _mutex;  
    // RAII class should not be able to be copied
    DISABLE_COPY_AND_ASSIGN(Mutex); 
};  
  
template <class T>  
class AutoLock {  
public:  
    explicit AutoLock(T* t) : _t(t) {  
        _t.lock();  
    }  
    ~AutoLock() {  
        _t.unlock();  
    }  
private:  
    T* _t;  
    // RAII class should not be able to be copied
    DISABLE_COPY_AND_ASSIGN(AutoLock);  
};  
    其实在C++11中的std::mutex和std::unique_lock已经实现了上述两个类的功能,引用The C++ Programming Language 4th Edition中的代码:

mutex m; // used to protect access to shared data
// ...
void f()
{
	unique_lock<mutex> lck {m}; // acquire the mutex m
	// ... manipulate shared data ...
}

书中的解释是:

A thread will not proceed until lck’s constructor has acquired its mutex, m (§5.3.4). 

The corresponding destructor releases the resource. So, in this example, unique_lock’s destructor 

releases the mutex when the thread of control leaves f() (through a return, by “falling off the 

end of the function,” or through an exception throw).

This is an application of the “Resource Acquisition Is Initialization” technique (RAII; §3.2.1.2, §13.3). 

This technique is fundamental to the idiomatic handling of resources in C++. 

Containers (such as vector and map), string, and iostream manage their 

resources (such as file handles and buffers) similarly.




C++11中的mutex, lock, condition variable实现分析 C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。   std::mutex   先来看下std::mutex:   包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛干嘛。 C++ class mutex { pthread_mutex_t __m_; public: mutex() _NOEXCEPT {__m_ = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;} ~mutex(); 立即下载

相关推荐

基于SVPWM控制策略的二极管钳位型NPC逆变器并网闭环simulink仿真

本文介绍了二极管钳位型三电平SVPWM技术在逆变器中的应用,通过控制IGBT的开关状态,将直流电压转换为三相交流电压,并采用钳位技术降低谐波失真,提高输出质量。文章还描述了基于SVPWM控制策略的二极管钳位型NPC逆变器并网闭环的Simulink仿真模型,该模型实现了并网控制,具有优异的性能,THD小于1%,适用于新手学习。仿真模型参数包括DC 800V、AC 380V、功率100kw,采用三电平NPC拓扑结构和SVPWM闭环控制策略,配备LCL滤波器,生成三电平波形,监测交流侧电压电流、有功功率和无功功率

2510_91195931的博客 465

锁(mutex)使用(c++11、c++14、c++17)

新的C++版本提供了以下锁: mutex (C++11) recursive_mutex (C++11) shared_mutex (C++17) timed_mutex (C++11) recursive_timed_mutex (C++11...

Zero丶的专栏 3513

告别安装报错!保姆级教程:用阿狸狗破戒大师V3.2.6搞定Cadence 17.4完整安装与补丁

本文提供Cadence 17.4的完整安装与破解教程,特别针对国内用户常见问题优化。从前期准备、镜像处理到阿狸狗破戒大师V3.2.6的智能破解,再到补丁管理与性能调优,详细指导每一步操作,确保一次性安装成功并提升设计效率。

weixin_30632089的博客 837

cpp实现线程池-半同步半异步

Lock.h #pragma once #include <mutex> #include <condition_variable> typedef std::recursive_mutex RecursiveMutex; typedef std::lock_guard<RecursiveMutex> RecursiveLock; typedef st...

The Coding World 581

搞定安卓11+抓包难题:用Kitsune Mask、magic_overlayfs和LSPosed三件套绕过SSL Pinning(保姆级教程)

本文详细解析了安卓11+系统中抓包面临的核心挑战,包括SSL Pinning和Root检测机制,并提供了使用Kitsune Mask、magic_overlayfs和LSPosed三件套的完整解决方案。通过动态分区技术解析和工具链配置,帮助开发者绕过安全限制,实现高效抓包分析。

weixin_42665255的博客 442

GEE土地分类:土地分类精度评定和分类后影像进行(Kmeans,Gmeans,SNIC (Simple Non-Iterative Clustering)聚类分析和滤波(focal_mode)分析

使用聚类分析和滤波分析来进一步处理土地分类后的影像数据。聚类分析可以帮助您识别影像中的相似区域。您可以使用聚类算法,如K均值聚类或层次聚类,将像素分组到具有相似像素值的群集中。这可以帮助您更好地理解图像中的空间模式和结构,并可能揭示有用的信息。滤波分析可以帮助您平滑图像并去除噪声。常见的滤波器包括中值滤波器和高斯滤波器。这些滤波器可以帮助您消除图像中的随机变化,并使其更易于解释和分析。

此星光明博客 2516

Mutex::AutoLock介绍

互斥类—Mutex Mutex是互斥类,用于多线程访问同一个资源的时候,保证一次只有一个线程能访问该资源。在《Windows核心编程》①一书中,对于这种互斥访问有一个很形象的比喻:想象你在飞机上如厕,这时卫生间的信息牌上显示“有人”,你必须等里面的人出来后才可进去。这就是互斥的含义。 下面来看Mutex的实现方式,它们都很简单。 (1)Mutex介绍 其代码如下所示: [-->Threa

southcamel的专栏 3万+

【已解决】WorkBuddy 国内版与国际版共存 + 关闭自动更新 教程

本文介绍在Windows系统中同时安装并共存WorkBuddy国内版与国际版的完整方案,通过修改product.json文件关闭启动自动更新,修复缓存配置污染问题,确保两版本互不干扰、数据独立。重点解决因共享身份标识导致的更新源错乱、进程锁冲突及自动覆盖风险,提供命令行备份与修改步骤,并强调手动升级时需避免使用应用内更新功能,以规避平台参数错位缺陷。

人生是一场修行 1506

【C++】11新特性:std::thread、std::mutex和两种RAII方式的锁封装

c++11引入了`std::thread`来创建线程,支持对线程`join`或者`detach`。`std::mutex`是一种线程同步的手段,用于保存多线程同时操作的共享数据。相比于以往的`pthread_mutex_t`方便了许多。c++11主要有`std::lock_guard`和`std::unique_lock`两种锁封装的方式,可以动态的释放锁资源,防止线程由于编码失误导致一直持有锁。

qq_41950508的博客 1762

安全与加密常识(10)linux系统证书管理

1. 将自定义CA证书(如my-ca.crt)放到源目录# 2. 编辑配置文件,启用该证书(末尾添加一行 my-ca.crt)# 3. 执行命令同步(核心工作环节)# 4. 验证结果:检查是否生成哈希链接和合并到证书束ls /etc/ssl/certs/my-ca.pem # 证书文件ls /etc/ssl/certs/$(openssl x509 -hash -noout -in /usr/share/ca-certificates/my-ca.crt).0 # 哈希链接。

二进制君 283

SAP 中配置权限职责菜单并分配给用户的核心流程是:用PFCG 创建 / 维护角色(含菜单、事务码、权限)→ 生成权限参数文件 → 通过 SU01/SU10 将角色分配给用户

SAP权限配置核心流程:1)通过PFCG创建角色,配置菜单事务码及权限对象;2)生成权限参数文件;3)用SU01/SU10分配角色给用户。关键步骤包括:在PFCG中维护菜单结构、设置权限字段值、生成Profile,通过用户比较验证权限。批量分配可用SU10,特殊需求可创建复合角色或自定义权限对象。常见问题需检查权限缺失(SU53)、菜单分配及组织级别设置。流程简化为:创建角色→配置权限→分配用户→验证生效。

金牌架构师 1273

C++11 并发指南三(Lock 详解)

在 《C++11 并发指南三(std::mutex 详解)》一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型。本节将详细介绍一下 C++11 标准的锁类型。 C++11 标准为我们提供了两种基本的锁类型,分别如下: std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。std::unique_lock,与 M

老衲不出家 479

手把手教你学simulink实例--基于Simulink的轨道交通车辆悬挂系统仿真

轨道交通车辆悬挂系统是保证列车运行平稳性、舒适性和安全性的重要组成部分。通过悬挂系统的合理设计,可以有效减小车辆在运行过程中受到的轨道不平顺和振动影响。基于MATLAB/Simulink平台进行悬挂系统仿真,可以对悬挂系统的动力学行为、控制策略以及性能优化等环节进行建模与分析,从而验证系统的设计性能并优化参数。本项目旨在构建一个完整的轨道交通车辆悬挂系统仿真模型,包括悬挂系统动力学建模、控制策略模块以及性能评估模块,并通过仿真验证系统的稳定性和舒适性。

MHD0815的博客 1032

C++ 并发编程总结

C++ 的并发编程支持库包含了线程、原子操作、互斥、条件变量和 future 的内建支持。

专注计算机视觉算法训练,算法优化部署以及SDK开发的知识分享。 1854

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c++11 多线程 二 锁和互斥量

Locks mutex(互斥量)是 核心同步原语(原语:OS术语,由若干指令组成,用于完成一定功能的一个过程)。在头文件中 有四种不同形式的的互斥量: •mutex:提供核心方法lock() unlock() 无阻塞 try_lock()(返回互斥量是否无法使用) •recursive_mutex:允许同一线程多次获得互斥量 •timed_mutex:和mutex一样,但比它多两

extend_die的专栏 693

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【c++11】并发指南之mutex类与lock类

1  mutex类:1.1 std::mutex,基本锁1.2 std::recursive_mutex,递归锁 std::recursive_mutex 与 std::mutex 一样,也是一种可以被上锁的对象,但是和 std::mutex 不同的是,std::recursive_mutex 允许同一个线程对互斥量多次上锁(即递归上锁),来获得对互斥量对象的多层所有权,std::recursiv...

chigusakawada的博客 1032

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++11 新特性

1)shared_ptr通常使用在所有权不明确的场景,会有多个智能指针同时管理一个内存。2)unique_ptr使用在独享内存的情况下,只允许一个智能指针来管理内存。3)避免智能指针和原始指针的混合交叉使用。4)智能指针解决内存泄露的问题,但系统资源仍然需要自己回收。5)使用智能指针的时候,每个指针对象都应该先初始化再使用。6)使用弱指针打破循环引用。最后,对于智能指针的使用,还是要谨慎,因为智能指针会导致性能的下降,所以,对于性能要求较高的程序,尽量不要用智能指针。

zhangpanpang的博客 1065

Mutex::Autolock引申的学习

Mutex::Autolock Android源码里面看到一个类,很简短,但稍微挖一挖,内容还蛮多。但首先理解需要几个知识点的优先掌握: Mutex.h Condition.h memory 首先找到Mutex.h,在/system/core/include/utils/Mutex.h目录,同样也很简短: /* * Copyright (C) 2007 The Android Open S...

Pizza_Lawson的专栏 1252

c++11 mutex ,lock 和 condition_variable 的使用用简介

C++11 并发指南三(std::mutex 详解) Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 头文件中,所以如果你需要使用 std::mutex,就必须包含 头文件。 头文件介绍 Mutex 系列类(四种) std::mutex,最基本的 Mutex 类。std::recursive_mu

郭立东的个人博客 1万+

C++11实现模板化(通用化)RAII机制

什么是RAII? RAII(Resource Acquisition Is Initialization),“资源获取即初始化”,是C++语言的一种避免泄漏的机制。  RAII的例子 以下是C++11头文件&lt;mutex&gt;中的lock_guard的源代码,看代码注释就清楚了,这是典型的RAII风格。  template&lt;typename _Mutex&gt; class ...

727

自动锁及示例 C++

 #include "windows.h"class CLock{private: CRITICAL_SECTION m_section;public: CLock(void) {   InitializeCriticalSection(&m_section); } ~CLock(void) {   DeleteCriticalSection(&m_section); } void loc

ANEnd2006的专栏 2430

C++11中lock_guard和unique_lock的区别

  C++11中有一个区域锁lock_guard,还有第二个区域锁unique_lock。    区域锁lock_guard使用起来比较简单,除了构造函数外没有其他member function,在整个区域都有效。    区域锁unique_guard除了lock_guard的功能外,提供了更多的member_function,相对来说更灵活一些。    unique_guard的最有用的一组函数...

bingqingsuimeng的专栏 3389

简单的AutoLock

Linux实现简单的AutoLock AutoLock对象实例化时(构造函数)加锁,析构时释放锁。 #include #include using namespace std; class AutoLock { public: AutoLock(pthread_mutex_t* mutex): m_mutex(mutex) { cout<<"loc

shigm0912的博客 2255

C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard

互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源。 C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用使用方法差不多。先使用std::mutex 定义一个互斥锁,例如std::mutex XXXmutex在需要使用互斥锁的时候,使用XXXmutex.lock();上锁,以及使用XXXmutex.un

缱绻的西格玛 2965

android 互斥锁 Mutex::Autolock

小白一枚,文章仅供参考,有错误请帮忙指出 前提: 要理解Mutex:: Autolock 的前提,需要知道C++的栈对象,在方法执行完之后,方法弹栈,对象会自动被回收,然后析构函数会被调用。 代码 使用实例 void test() { // 定义位置: system/core/libutis/include/utils/Mutex.h // 自动管理互斥,在方法调用结束使,对象存在栈中,会被自动回收,会调用对象的析构函数,会自动解锁。 Mutex::Autolock _l(gProc

大海牛的专栏 1659

c++11 mutex

mutex是多线程编程时经常用到的,在C++11中需要包含&lt;mutex&gt;模块。而在该文件中还有其他和mutex协作的类和函数,使得多线程编程时非常方便。 1 mutex类 mutex对象是一个lockable的对象,当关键区域需要被互斥访问的时候被用来当作信号。mutex对象提供互斥的拥有权限,并且不支持递归。 实际就是mutex是用来进行线程同步的。常用的成员函数有lock()和un...

konglongdanfo的博客 7406
上一篇: leveldb源码解析1——内存管理类Arena
下一篇: 由一段代码来深入理解C语言宏
macchan
博客等级 码龄20年 9粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值