c++实现的一对锁的封装(挺有意思的)
2012-10-26 16:03
344 查看
在使用锁的时候,出现的最多的问题是由于忘记对锁的释放从而出现的各种死锁问题。所以经常会去检查对应的锁是否在之后的代码中得到合适的释放。前段时间学习到很巧妙的实现,即在构造函数中实现对锁的锁定,在析构函数中实现对锁的释放,这样只需要在使用锁的时候,定义一个锁,接下来即进入临界区,最后在退出对应的作用域的时候,自动调用析构函数,对应的锁自动释放, 对于一些锁的简单使用,还是比较不错的,个人觉得挺有意思的,拿出来和大家分享下。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
class ThreadRWLock
{
public:
ThreadRWLock(){
pthread_rwlockattr_t attr;
pthread_rwlockattr_init(&attr);
pthread_rwlock_init(&_rw_lock, &attr);
}
~ThreadRWLock(){
pthread_rwlock_destory(&_rw_lock);
}
int AcquireRead(void){
return pthread_rwlock_rdlock(&_rw_lock);
}
int AcquireWrite(void){
return pthread_rwlock_wrlock(&_rw_lock);
}
int Release(void){
return pthread_rwlock_unlock(&_rw_lock);
}
private:
pthread_rwlock_t _rw_lock;
};
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//读锁的实现
class ReadLocker
{
public:
explicit ReadLocker(ThreadRWLock& rwlock): _lock_point(&rwlock)
{
_lock_point->AcquireRead();
_is_lock = true;
}
~ReadLocker(){
if (_is_lock)
_lock_point->Release();
}
void Lock(){
if (!_is_lock)
_lock_point->AcquireRead();
_is_lock = true;
}
void Unlock(){
if (_is_lock){
_lock_point->Release();
}
_is_lock = false;
}
private:
ThreadRWLock * _lock_point;
bool is_lock;
};
//读锁的使用示例:
void fun(void){
ThreadRWLock lock;
ReadLocker readlock(lock); //自动获取读锁
/*
临界区
*/
//退出作用域自动释放读锁
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//写锁的实现:
class WriteLocker
{
public:
explicit WriteLocker(ThreadRWLock& rwlock)
: _lock_point(rwlock){
_lock_point->AcquireWrite();
_is_lock = true;
}
explicit WriteLocker(ThreadRWLock* rwlock)
:_lock_point(rwlock){
_lock_point->AcquireWrite();
_is_lock = true;
}
~WriteLocker(){
if(_is_lock)
_lock_point->Release();
_is_lock = false;
}
void Lock(){
if (!_is_lock)
_lock_point->AcquireWrite();
_is_lock = true;
}
void Unlock(){
if (_is_lock)
_lock_point->Release();
_is_lock = false;
}
private:
ThreadRWLock * _lock_point;
bool _is_lock;
};
//写锁的使用示例(与读锁类似)
void fun(void){
ThreadRWLock lock;
WriteLocker writelock(lock); //自动获取写锁
/*
临界区
*/
//退出作用域自动释放写锁
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
class ThreadRWLock
{
public:
ThreadRWLock(){
pthread_rwlockattr_t attr;
pthread_rwlockattr_init(&attr);
pthread_rwlock_init(&_rw_lock, &attr);
}
~ThreadRWLock(){
pthread_rwlock_destory(&_rw_lock);
}
int AcquireRead(void){
return pthread_rwlock_rdlock(&_rw_lock);
}
int AcquireWrite(void){
return pthread_rwlock_wrlock(&_rw_lock);
}
int Release(void){
return pthread_rwlock_unlock(&_rw_lock);
}
private:
pthread_rwlock_t _rw_lock;
};
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//读锁的实现
class ReadLocker
{
public:
explicit ReadLocker(ThreadRWLock& rwlock): _lock_point(&rwlock)
{
_lock_point->AcquireRead();
_is_lock = true;
}
~ReadLocker(){
if (_is_lock)
_lock_point->Release();
}
void Lock(){
if (!_is_lock)
_lock_point->AcquireRead();
_is_lock = true;
}
void Unlock(){
if (_is_lock){
_lock_point->Release();
}
_is_lock = false;
}
private:
ThreadRWLock * _lock_point;
bool is_lock;
};
//读锁的使用示例:
void fun(void){
ThreadRWLock lock;
ReadLocker readlock(lock); //自动获取读锁
/*
临界区
*/
//退出作用域自动释放读锁
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//写锁的实现:
class WriteLocker
{
public:
explicit WriteLocker(ThreadRWLock& rwlock)
: _lock_point(rwlock){
_lock_point->AcquireWrite();
_is_lock = true;
}
explicit WriteLocker(ThreadRWLock* rwlock)
:_lock_point(rwlock){
_lock_point->AcquireWrite();
_is_lock = true;
}
~WriteLocker(){
if(_is_lock)
_lock_point->Release();
_is_lock = false;
}
void Lock(){
if (!_is_lock)
_lock_point->AcquireWrite();
_is_lock = true;
}
void Unlock(){
if (_is_lock)
_lock_point->Release();
_is_lock = false;
}
private:
ThreadRWLock * _lock_point;
bool _is_lock;
};
//写锁的使用示例(与读锁类似)
void fun(void){
ThreadRWLock lock;
WriteLocker writelock(lock); //自动获取写锁
/*
临界区
*/
//退出作用域自动释放写锁
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
相关文章推荐
- C++封装继承多态 及内部实现原理详解
- C++对注册表常见操作的封装实现(五)
- C++实现委托机制(三)——lambda表达式封装
- multi-reactor服务器模型的C++封装类(libevent+多线程实现)
- 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
- c++ 封装哈希表(Hash) 以及实现迭代器(iterator)
- 封装C++实现Window和Linux下多线程Socket通信
- C++ 线程池的封装实现
- MySQL的C++封装实现数据库的创建,表的创建,数据库的读写操作
- C++中的property库的设计与实现过程(三)——将对象封装到property里面
- sogou interview ==> C 实现 C++ 封装 继承 多态
- 实现linux的互斥量c++封装
- 关于linux锁的c++封装 条件锁,读写锁(不同方式实现读写优先)
- 双链表的实现C++封装
- C++封装POSIX 线程库(五)实现CountDownLatch
- C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗(从面向对象的三大属性进行分析)
- C++封装hook,为了实现系统hook
- epoll定时器实现系列文章:linux c++ 利用timerfd和epoll封装计时器(Timer)类
- [C++]MYSQL 数据库操作封装及连接池实现
- Linux线程池C++封装实现