自动锁释放的方式
将堆数据 与 栈数据结合的方式,实现锁自动释放,autoLock管理类是栈数据,但是CLock锁实例是堆信息,栈数据在退出函数时会自动释放,借着栈中的析构函数此时实例也自然也就解锁了
Clock声明及实现
class CLock
{
public:
CLock();
virtual ~CLock();
void lock();
void unlock();
pthread_mutex_t& getMutex() { return m_lock; }
private:
pthread_mutex_t m_lock;
};
CLock::CLock(){
pthread_mutex_init(&m_lock,NULL);
}
CLock::~CLock(){
pthread_mutex_destroy(&m_lock);
}
void CLock::lock(){
pthread_mutex_lock(&m_lock);
}
void CLock::unlock(){
pthread_mutex_unlock(&m_lock);
}
AutoLock管理类声明及实现
class CAutoLock
{
public:
CAutoLock(CLock* pLock);
virtual ~CAutoLock();
private:
CLock* m_pLock;
};
CAutoLock::CAutoLock(CLock* pLock){
// 锁住
m_pLock = pLock;
if(NULL != m_pLock)
m_pLock->lock();
}
CAutoLock::~CAutoLock(){
// 释放
if(NULL != m_pLock)
m_pLock->unlock();
}
使用AutoLock 示例
// 在文件开头创建一个锁实例
static CLock* g_pLock = new CLock();
CSyncCenter* CSyncCenter::test(){
// 传入文件开头的锁实例,但autoLock 作为栈空间数据,
// 在test结束时会自身进行析构,析构时则可以达到解锁的作用
CAutoLock autoLock(g_pLock);
if(m_pInstance == NULL)
{
m_pInstance = new CSyncCenter();
}
return m_pInstance;
}
// 文件中各处使用时