php 网站调试,昆山网站建设公司哪家好,网站建设包括哪几个方面,上海网站编辑招聘什么是RAII机制RAII是Resource Acquisition Is Initialization#xff08;翻译成 “资源获取即初始化”#xff09;的简称#xff0c;是C 语言的一种管理资源、避免资源泄漏的惯用法#xff0c;该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象… 什么是RAII机制RAII是Resource Acquisition Is Initialization翻译成 “资源获取即初始化”的简称是C 语言的一种管理资源、避免资源泄漏的惯用法该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象在对象的构造函数中获取资源在对象生命期内控制对资源的访问最后在对象消失时其析构函数来释放获取的资源这里的资源可以是文件句柄内存Event互斥量等等由于系统的资源是有限的就好比自然界的石油铁矿一样不是取之不尽用之不竭的。所以我们在编程安全上要求必须遵循以下几个步骤1. 申请资源2. 使用资源3. 释放资源在步骤一和步骤二上我们平时都比较容易把握而资源的释放会因为种种编码原因容易被忽略导致系统资源实际没有使用了但却没有释放或者引发其他问题影响了系统资源利用率。没有使用RAII机制的弊端那么我们为什么涉及资源管理时建议使用RAII机制进行编码呢不推荐的编码方式片段while (TRUE) { //等待直到获得指定对象的所有权 EnterCriticalSection(g_csLock); //关键代码段-begin if (g_nIndex nMaxCnt) { cout Index g_nIndex ; cout Thread2 is runing endl; //权限释放容易忘记 LeaveCriticalSection(g_csLock); } else { //权限释放容易忘记 LeaveCriticalSection(g_csLock); //关键代码段-end break; } }之所以不推荐这样的编码方式是因为EnterCriticalSection/LeaveCriticalSection必须配对使用很需要依赖人无法根本上解决问题如果LeaveCriticalSection函数没有执行或者忘记添加该API很容易引发问题。互斥锁应用RAII机制为了从根本上解决问题减少人为因素引发应用系统问题或者资源泄漏在关键代码段和互斥量这两种锁上示范了如何应用RAII机制简化多线程互斥编码。关键代码段初始化和锁接口:class CSLock{public: CSLock() { //构造函数时初始化关键代码段对象获取资源 InitializeCriticalSection(m_csLock); }~CSLock() { //析构函数时释放为关键代码段对象分配的所有资源释放资源 DeleteCriticalSection(m_csLock); } //生命周期内实现对象资源的管理(Lock/Unlock)使用资源 void Lock() { EnterCriticalSection(m_csLock); }void Unlock() { LeaveCriticalSection(m_csLock); } //阻止锁的拷贝和赋值private: CSLock (const CSLock ); CSLock operator (const CSLock);private: CRITICAL_SECTION m_csLock; };创建互斥量对象和锁接口:class CMutexLock{public: CMutexLock() { m_hMutex CreateMutex(NULL, FALSE, NULL);//获取资源 }~CMutexLock() { CloseHandle(m_hMutex);//释放资源 }void Lock() { WaitForSingleobject(m_hMutex, INFINITE);//使用资源 }void Unlock() { ReleaseMutex(m_hMutex);//使用资源 } //阻止锁的拷贝和赋值private: CMutexLock(const CMutexLock); CMutexLock operator (const CMutexLock);private: HANDLE m_hMutex;};类模板对象,再一次使用RAII机制管理锁对象的占用和释放建议简化锁的应用实现资源的自动回收templateclass Tclass CLockGuard{public: CLockGuard(T locker) :m_lockerObj(locker) { m_lockerObj.Lock(); }~CLockGuard() { m_lockerObj.Unlock(); }private: