使用RAII来管理对象资源
2016-06-09 22:41
381 查看
RAII(资源获取即初始化)基本技术原理很简单,如果希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命期和对象的生命期相关联。这样的话,就可以利用c++复杂老练的对象管理机制来管理资源。最简单的形式是,当你构造一个对象的时候,其构造对象会获得一份资源,而析构函数则释放这份资源。采用对象管理资源,即使碰到意外的return、异常(C++保证如果抛出了异常,局部对象就会被销毁)甚至是邪恶的goto,均可以释放资源。
举个例子:
在网络编程中如果使用pthread_mutex_t进行互斥操作的话,lock和unlock操作必须匹配,必须保证被lock的资源在函数执行结束时可以被unlock,当出现意外情况比如程序发生错误或者是异常直接退出,而被锁住的mutex并没有来得及unlock那么后果不堪设想.如果在其他正在运行的代码中使用了这个mutex,对其执行lock会出现死锁的情况.对于这种情况,使用RAII的特性,用对象来管理资源就会十分方便.代码如下:
举个例子:
在网络编程中如果使用pthread_mutex_t进行互斥操作的话,lock和unlock操作必须匹配,必须保证被lock的资源在函数执行结束时可以被unlock,当出现意外情况比如程序发生错误或者是异常直接退出,而被锁住的mutex并没有来得及unlock那么后果不堪设想.如果在其他正在运行的代码中使用了这个mutex,对其执行lock会出现死锁的情况.对于这种情况,使用RAII的特性,用对象来管理资源就会十分方便.代码如下:
//CThreadMutex.h class CThreadMutex : public noncopyable { private: pthread_mutex_t m_Mutex; public: CThreadMutex(); virtual ~CThreadMutex(); pthread_mutex_t GetPthreadMutex(); void Lock(); // bool tryLook(); void unlock(); }; class CThreadMutexGuard : public noncopyable { public: CThreadMutexGuard(CThreadMutex &m_Mutex); virtual ~CThreadMutexGuard(); private: CThreadMutex& m_Mutex; };
//CThreadMutex.cpp #include "CThreadMutex.h" CThreadMutex::CThreadMutex() { pthread_mutex_init(&m_Mutex, NULL); } CThreadMutex::~CThreadMutex() { pthread_mutex_destroy(&m_Mutex); } pthread_mutex_t CThreadMutex::GetPthreadMutex() { return this->m_Mutex; } void CThreadMutex::Lock() { pthread_mutex_lock(&m_Mutex); } void CThreadMutex::unlock() { pthread_mutex_unlock(&m_Mutex); } CThreadMutexGuard::CThreadMutexGuard(CThreadMutex& m_Mutex) : m_Mutex(m_Mutex) { m_Mutex.Lock(); } CThreadMutexGuard::~CThreadMutexGuard() { m_Mutex.unlock(); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Python3写爬虫(四)多线程实现数据爬取
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- C#实现多线程的同步方法实例分析
- Lua中调用C++函数示例
- 浅谈chuck-lua中的多线程
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C++联合体转换成C#结构的实现方法
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析