RAII:互斥量
来源:互联网 发布:overcooked for mac 编辑:程序博客网 时间:2024/05/02 04:53
RAII(资源获取即初始化)基本技术原理很简单,如果希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命期和对象的生命期相关联。这样的话,就可以利用c++复杂老练的对象管理机制来管理资源。最简单的形式是,当你构造一个对象的时候,其构造对象会获得一份资源,而析构函数则释放这份资源。采用对象管理资源,即使碰到意外的return、异常(C++保证如果抛出了异常,局部对象就会被销毁)甚至是邪恶的goto,均可以释放资源。
#include<iostream>#include<exception>#include<pthread.h>#include<unistd.h>#include<string>#include<boost/noncopyable.hpp>using namespace std;using namespace boost;class Mutex:noncopyable{ public: Mutex(){ pthread_mutex_init(&mutex,NULL); } void lock() const{ pthread_mutex_lock(&mutex); } void unlock() const{ pthread_mutex_unlock(&mutex); } ~Mutex(){ cout<<"Mutex::unlock"<<endl; pthread_mutex_destroy(&mutex); } private: mutable pthread_mutex_t mutex;};class MutexLockGuard:noncopyable{ public: explicit MutexLockGuard(Mutex& mutex):mutex_(mutex){//显示构造 mutex_.lock(); } ~MutexLockGuard(){ mutex_.unlock(); } private: Mutex& mutex_;//注意这里是引用!};Mutex mutex;pthread_mutex_t mutex_=PTHREAD_MUTEX_INITIALIZER;void fun(){ pthread_mutex_lock(&mutex_); MutexLockGuard lock(mutex );//这里开始时犯了一个错误MutexLockGuard(mutex)...汗 throw 1; pthread_mutex_unlock(&mutex_); cout<<"pthread_mutex_unlock"<<endl;//由于抛出异常该句不执行,可见某些情况让lock和unlock不配对}int main(){ try{//throw抛出异常时会清理该块内的对象 fun(); }catch(int &temp){//catch会将将抛出的异常对象复制拷贝,如果catch参数是传值的,则拷贝构造一个新的对象作为catch语句的参数的值。在该catch语句结束时,先析构catch的传值的参数对象,然后析构throw语句抛出的异常对象。引用参数是为了效率。throw抛出的异常对象和catch实行严格匹配,不允许类型转换。 cout<<"异常对象:"<<temp<<endl; } return 0;}
执行结果:
异常对象:1
Mutex::unlock
- RAII:互斥量
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII
- RAII详解
- C++ RAII
- C++ RAII
- C++ RAII
- RAII详解
- 高级PHP应用程序漏洞审核技术
- Andorid sun-java5-jdk 和 sun-java6-jdk的安装
- Extjs的gridPanel中列点击图片调用方法
- 驱动编程准备 配置内核树
- 那些年写过的shell------模式匹配
- RAII:互斥量
- java开发中经常遇到的问题
- Cortex-A相对经典ARM处理器的扩展
- VC 6.0工程向VS 2010转换的问题
- OCP-1Z0-053-V12.02-335题
- 学习软件开发应该看的书
- LeetCode题解:Reverse integer
- 大学c语言程序
- Ubuntu上安装Qt5