用RAII的思想去管理Windows的读写锁SRWLock

C++高效INI解析器设计:内存映射、XXTEA加密与Windows配置管理实践 配置文件是软件工程中连接程序逻辑与外部环境的关键组件,其核心原理在于通过键值对存储实现程序行为的动态调整。在Windows平台的C++开发中,INI文件因其结构简单、无需依赖而被广泛使用。传统Windows API函数存在性能瓶颈与功能缺失,因此,构建一个高效、安全的INI解析器具有重要的技术价值。通过采用内存映射数据结构(如unordered_map)实现O(1)访问,并集成轻量级加密模块(如XXTEA算法),可以有效提升配置管理的性能与安全性。这种设计尤其适用于需要保护敏感信息(如数据库连接字符串)的桌 阅读详情

前言

最近对C++的RAII(资源申请初始化),又有了新的理解。

我们C++中使用一个资源(例如 内存)的步骤:

  1. 申请资源
  2. 使用资源
  3. 释放资源

简述一下RAII:

就是可以自动回收资源,将资源封装成对象。

关键在于:
变量的生命周期结束后,会自动释放变量。
例如一个变量是局部变量,存储在栈上,那么当该函数结束后,这个变量就已经被释放掉了。
那么,当变量是类变量的时候,当该类对象变量生命周期结束后,应该调用析构函数释放掉该资源!

生命周期

局部变量:存储在栈上,生命周期结束后,由栈释放。
全局或静态变量:存储在data段,生命周期是整个进程,自动释放。
堆上对象:存储在堆上,生命周期结束后,由编程人员释放。

我们申请内存的时候,就是在申请堆上的资源,所以需要我们手动释放,当我们忘记释放的时候,就会引起内存泄漏!

那么我们通过RAII的思想就可以解决这个问题!
使用栈上对象管理堆上的对象,通过析构函数,就可以确定资源释放的实际!

RAII 举例

实际上智能指针就是利用了RAII的思想。
这里简述一下:
构造函数申请指针资源,然后进行使用,当生命周期结束,析构函数会释放资源!

template<class T>
class smart_ptr
{
public:
	smart_ptr()(T* ptr = nullptr)
		:_ptr(ptr)
	{
		// 构造函数
	}
	~smart_ptr()
	{
		// 析构函数
		if (_ptr)
			delete _ptr;
	}
	//智能指针的第二个特性
	T& operator*()
	{
		return *_ptr;
	}
	T* operator->()
	{
		return _ptr;
	}
private:
	T* _ptr;
}

使用RAII的思想管理Windows的读写锁

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;

CRITICAL_SECTION cs;
int gGlobal = 0;

class MyLock
{
public:
    MyLock()
    {
        EnterCriticalSection(&cs);
    }

    ~MyLock()
    {
        LeaveCriticalSection(&cs);
    }

private:
    MyLock( const MyLock &);
    MyLock operator =(const MyLock &);
};

void DoComplex(MyLock &lock ) // 非常感谢益可达犀利的review 2014.04.13
{
}

unsigned int __stdcall ThreadFun(PVOID pv) 
{
    MyLock lock;
    int *para = (int *) pv;

    // I need the lock to do some complex thing
    DoComplex(lock);

    for (int i = 0; i < 10; ++i)
    {
        ++gGlobal;
        cout<< "Thread " <<*para<<endl;
        cout<<gGlobal<<endl;
    }
    return 0;
}

int main()
{
    InitializeCriticalSection(&cs);

    int thread1, thread2;
    thread1 = 1;
    thread2 = 2;

    HANDLE handle[2];
    handle[0] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void *)&thread1, 0, NULL );
    handle[1] = ( HANDLE )_beginthreadex(NULL , 0, ThreadFun, ( void *)&thread2, 0, NULL );
    WaitForMultipleObjects(2, handle, TRUE , INFINITE );
    return 0;
}


这个例子可以说是实际项目的一个模型,当多个进程访问临界变量时,为了不出现错误的情况,需要对临界变量进行加锁;上面的例子就是使用的Windows的临界区域实现的加锁。

但是,在使用CRITICAL_SECTION时,EnterCriticalSection和LeaveCriticalSection必须成对使用,很多时候,经常会忘了调用LeaveCriticalSection,此时就会发生死锁的现象。当我将对CRITICAL_SECTION的访问封装到MyLock类中时,之后,我只需要定义一个MyLock变量,而不必手动的去显示调用LeaveCriticalSection函数。

作者:DayDayUpppppp
链接:https://www.jianshu.com/p/b7ffe79498be
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

优点

这样的优点就是
第一:你不需要担心忘记释放资源,而引起的问题
第二:使用起来更加简单,只需要用,不用管释放的问题

参考资料

C++中的RAII机制

Windows多线程编程入门:CreateThread API原理与实战详解 多线程编程是现代软件开发中提升程序性能、实现并发处理的核心技术。其基本原理在于允许一个进程内同时运行多个执行流,共享进程资源但拥有独立的栈空间和程序计数器,从而充分利用多核CPU的计算能力。在Windows平台进行系统级开发时,理解线程的底层创建与管理机制至关重要,这直接关系到程序的稳定性与性能优化。CreateThread作为Win32 API中最基础的线程创建函数,提供了对线程生命周期的精细控制,是深入理解Windows线程模型和同步机制的关键入口。通过掌握线程函数签名、参数传递、句柄管理及同步对象(如 阅读详情

相关推荐

构建工业级C++跨平台架构:从分层设计到部署实战

跨平台开发是现代高性能软件,如工业控制、音视频处理和游戏引擎等领域的核心需求,旨在实现代码在Windows、Linux、macOS等多操作系统环境下的稳定运行。其核心原理在于通过抽象层隔离平台相关细节,依赖倒置原则确保高层业务逻辑不依赖于底层具体实现。这种架构的技术价值在于保障了行为一致性、提升了代码可维护性,并使得性能可控。在应用场景上,它广泛服务于需要大规模部署和高可靠性的工业级软件项目。本文聚焦于C++语言,深入探讨如何设计清晰的分层模型,并实践关键模块如文件系统、线程同步和网络通信的跨平台抽象,最终

cunfuxiao7305的博客 502

c++ 11读写锁

参考:C++中的RAII_一蓑烟雨任平生 也无风雨也无晴-优快云博客 C++11实现模板化(通用化)RAII机制_10km的专栏-优快云博客_c++11 raii 无锁编程:c++11基于atomic实现共享读写锁(写优先)_10km的专栏-优快云博客 raii.h #include <type_traits> #include <functional> namespace gyd { /* 元模板,如果是const类型则去除const修饰符 */ templat

qq_36583051的博客 3425

Windows编程——读写锁

读写锁,线程同步,Windows

Think88666的博客 2024

多线程访问共享锁和独占锁

SRWLOCK     g_sCallNumberMapRwLock;

liuyinghui523的专栏 807

深入理解Windows多线程同步机制

本篇博文深入探讨了Windows多线程编程中的同步机制,包括临界区、事件对象、互斥体、信号量和读写锁的概念和使用。通过代码示例,展示了如何使用RAII技术优化临界区管理,并讨论了Event对象、Mutex对象和Semaphore对象的创建和使用方法。同时,博主介绍了SRW Locks读写锁的基本用法,为多线程编程提供了宝贵的实践指南。

weixin_35390379的博客 403

windows 读写锁 (基于关键区的读写锁类 及自动锁)

读写锁的类 及demo 基于网上的类 改写了几处逻辑不合理的地方 :1、新的读锁来了如已有写锁等待 新的读锁进入等待 2、等待的读锁获取到执行权限后 把正等待的所有读锁全部激活

最新Windows下c++读写锁SRWLock介绍

最新Windows下c++读写锁SRWLock介绍     本文导语:  读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让...    读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新

chenzhjlf的专栏 9322

FactoryTool量产神器实战:5分钟搞定多块RK3568板卡并行烧录

本文详细介绍了使用瑞芯微FactoryTool对多块RK3568板卡进行高效并行烧录的实战指南。文章从硬件连接、驱动配置、软件操作到排错技巧,提供了一套完整的量产解决方案,重点阐述了如何利用该工具在5分钟内完成多设备固件烧录,并确保eMMC存储的写入稳定性与效率,大幅提升生产线吞吐量。

b0c1d2的博客 992

读写锁SRWLock

         读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。        对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。        因此用读写锁来解决读者写者问题会使代码非常清晰和简洁。          SRWLock 允许我们区分那些想要读取资...

简约不简单 556

(数字ic验证)从零开始的apb_watchdog验证模块搭建(一、功能介绍与环境搭建)

apb_watchdog验证模块搭建(一)文章目录 文章目录apb_watchdog验证模块搭建(一)文章目录前言一、apb_watchdog简单功能介绍二、测试平台环境搭建1.测试所用模板介绍2.tb与interface2.env与watchdog_pkg3.test与base_sequence4.Makefile总结——当前验证结构 前言 本文介绍了apb_watchdog验证模块的搭建过程与其具体代码,主要包括其中验证环境的构建,测试序列的发送与回归测试收集。主要运用systemvorilog与u

peop1e的博客 9739

100天精通Python(爬虫篇)——第114天:爬虫基础模块之requests基础入门

一、request模块大总结 1. 下载安装 2. 常用属性或方法 3. response.text和response.content的区别: 4. 发送带headers参数请求 5. 发送带参数请求 6. 在headers参数中携带cookie 7. 超时参数timeout的使用 8. proxies代理参数的使用 9. 发送post请求...............

努力让自己发光,对的人才能迎着光而来 11万+

C++读写锁std::shared_mutex原理与应用:多线程性能优化实战

在多线程编程中,数据竞争和锁竞争是影响系统性能的关键因素。读写锁(Read-Write Lock)作为一种并发控制机制,其核心原理在于区分共享读与独占写操作,允许多个读线程同时访问共享资源,从而显著提升系统吞吐量。这种设计在工程实践中尤其适用于读多写少的场景,如全局配置管理、数据缓存等。通过合理使用读写锁,可以有效减少线程阻塞,优化CPU利用率。本文以C++17标准引入的std::shared_mutex为例,深入解析其内部机制,探讨如何避免锁升级陷阱,并结合RAII包装器确保资源安全。同时,文章将介绍性能

cuanji3287的博客 396

【unity游戏开发入门到精通——UGUI】文本控件 —— TextetMeshPro新文本控件(TextMeshPro - Text(UI)和TextMeshPro - Text)

文本组件是UGUI中最常用的组件,它的作用是对文本数据进行处理并显示。UGUI的文本组件可以分两为种——Text旧文本控件、TextMeshPro新文本组件。本文主要是介绍TextMeshPro新文本控件,而TextMeshPro新文本控件又可以分为两种——TextMeshPro - Text(UI)和TextMeshPro - Text。TextMeshPro是Unity收购的一个第三方插件,现在已经自动内置到编辑器中,只要使用一次就会自动导入到工程。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3767

C++跨平台(六):跨平台多线程编程

macOS的pthread会对明显的死锁(同一线程重复lock同一个非递归mutex)触发断言,Windows的SRWLOCK则静默允许(但这是未定义行为)。:由于调度时序差异,一个在Windows上"碰巧工作"的竞态条件可能在Linux上频繁触发(反之亦然)。(C++17)实现了读写锁——多个线程可以同时持有读锁(shared lock),但写锁(unique lock)是互斥的。这与Java(守护线程自动结束)或Python(解释器等待所有非daemon线程)的行为不同,是新手最常犯的错误。

weixin_42388661的博客 326

10种电阻综合对比——《器件手册--电阻》

可变电阻在电子设备中也有很多用途,如在收音机的音量调节电路中,通过旋转可变电阻的旋钮来改变电路中的电阻值,从而改变通过扬声器的电流,实现音量的调节。根据电阻定律,电阻R = ρ(L/S),其中ρ是导体材料的电阻率,L是导体的长度,S是导体的横截面积。比如,同样材料制成的两根电线,粗的电线电阻比细的电线电阻小,长的电线电阻比短的电线电阻大。电流采样电阻的工作原理基于欧姆定律,即电阻两端的电压与通过电阻的电流成正比,公式为 I = V/R,其中 I是电流,V是电阻两端的电压,R 是电阻值。

XU157303764的博客 3147

【x264编码器】章节1——x264编码流程及基于x264的编码器demo

提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。

vcvdv123的博客 5744

C++多线程锁实战:从互斥锁到无锁编程的进阶指南

并发编程是现代软件开发的核心技术,其核心挑战在于安全高效地管理共享数据。数据竞争(Data Race)是并发程序中最常见的问题之一,会导致程序崩溃或数据损坏。为了解决这一问题,C++标准库提供了以std::mutex为代表的锁机制,其原理是通过互斥访问确保临界区代码的原子性。锁的技术价值在于简化并发逻辑,保障数据一致性,但其不当使用会引发死锁和性能瓶颈。在工程实践中,锁的应用场景广泛,从基础的计数器保护到复杂的配置管理、缓存系统和高性能网络框架(如DPDK)都离不开它。针对读多写少的场景,读写锁(std::

chiman6219的博客 423

​网格划分理论:CFD理论67 网格划分-三大理论问题_哔哩哔哩_bilibili传统解释非结构化网格是不对的——计算传热学大叔专题讨论2--CFD网格类型_哔哩哔哩_bilibili

传统解释非结构化网格是不对的——计算传热学大叔。fluent计算理论和离散方法原理视频推荐。

qq_15963745的博客 183

VC++6实现银行排队叫号系统:多线程同步与C/S架构实战

客户端-服务器(C/S)架构是分布式系统的基础模型,其核心在于通过网络协议实现不同进程间的通信与协作。在并发编程中,多线程同步机制确保共享数据的一致性,避免竞态条件。这些技术为构建高响应、高可用的业务系统提供了基础支撑,广泛应用于金融、电信等实时性要求高的领域。本文以银行排队叫号系统为例,通过VC++6和MFC框架,深入探讨了如何运用临界区(CCriticalSection)实现线程安全队列管理,并结合消息队列机制优化界面与后台交互。项目不仅演示了C/S架构在模拟业务调度中的落地,还通过数据持久化与调试技巧

weixin_34095889的博客 540

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1352

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Windows平台下的读写锁

Windows平台下的读写锁 简单介绍Windows平台下的读写锁以及实现. 背景介绍 Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(InitializeSRWLock, AcquireSRWLockShared, AcquireSRWLockExclusive等).考虑到目前Windows XP的装机量,只能自己实现一个读写锁了.

Que's C++ Studio 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock

在《秒杀多线程第十一篇读者写者问题》文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题。问题虽然得到了解决,但代码有点复杂。本篇将介绍一种新方法——读写锁SRWLock来解决这一问题。读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程...

huobengluantiao8 374

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Windows线程同步之Slim读写锁(SRWLock)

Slim读写锁简称SRWLock,它的目的和临界区相同,对一个资源进行保护,不让其他线程访问。但是不同的是SRWLock允许我们区分哪些线程是读取共享资源的值,哪些线程是修改共享资源的值。所有读线程在同一时刻可以访问共享资源,因为这些线程不会破坏共享资源,只有当写线程要访问共享资源时,才需要进行同步。写线程应当独占式访问资源,其他任何线程都不允许访问资源。这就是SRWLock提供的全部功能。 所...

jishublog 382

Windows核心编程笔记(八)用户模式下的线程同步 SRWLock剖析

在VISTA及之后的系统中,引入了 SRWLock 用户用户模式的线程同步,MSDN中是这样描述的。 SRWLock  轻量级的读写锁,它与临界区对象的不同在于,它分为两个模式来访问共享资源。并假设有两种类型的线程同时工作,一种用在读取共享资源,通常又称为消费线程,另一种用来对共享的资源进程写入操作,通常又称为生产线程。 共享模式下每个读取线程可以读取共享的

春暖花开 5882

【操作系统】读写锁实现&&读写锁原理(亲测可用)

当一个线程请求写锁时,如果当前有读锁或者写锁,该线程会被阻塞,直到读锁和写锁都被释放。读锁和写锁的释放都会唤醒等待的线程。读锁的获取:当一个线程请求读锁时,如果当前没有写锁或者写锁的持有者和请求读锁的线程是同一个线程,那么该线程可以获得读锁,否则该线程会被阻塞,直到写锁被释放。写锁的获取:当一个线程请求写锁时,如果当前没有读锁或者写锁,那么该线程可以获得写锁,否则该线程会被阻塞,直到读锁和写锁都被释放。读锁的释放:当一个线程释放读锁时,如果没有其他线程持有写锁,那么该线程释放读锁,否则该线程继续持有读锁。

Michael 649
上一篇: Visual Studio 2022 正式版下载教程
下一篇: 在Windows上安装git
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值