mysql lock scope_scope_lock模式详解
在《Unix下的線程互斥量》一文中我們使用Thread_Mutex來保護(hù)線程共享資源,但如果互斥體上鎖之后沒有解鎖就會(huì)發(fā)生死鎖。這是一個(gè)很普遍的錯(cuò)誤,我們采用Scope Lock模式,我們構(gòu)造對(duì)象Scope_Mutex,其中構(gòu)造函數(shù)對(duì)互斥體加鎖,析構(gòu)函數(shù)對(duì)互斥體解鎖。C++保證了析構(gòu)函數(shù)一定會(huì)被調(diào)用,所以即使是有異常拋出,互斥體也總是會(huì)被正確的解鎖。下面給出Scope_Mutex的具體實(shí)現(xiàn):
class?Scope_Mutex
{
private:
Thread_Mutex?mMutex;
Scope_Mutex(const?Scope_Mutex&);
Scope_Mutex&?operator=(const?Scope_Mutex&);
public:
//?構(gòu)造時(shí)對(duì)互斥量進(jìn)行加鎖
explicit?Scope_Mutex(Thread_Mutex?&m)?:?mMutex(m)
{
mMutex.lock();
}
//?析構(gòu)時(shí)對(duì)互斥量進(jìn)行解鎖
~Scope_Mutex()
{
mMutex.unlock();
}
};
class?Thread_Mutex?{
public:
/*
*?構(gòu)造函數(shù)
*/
Thread_Mutex()?{
assert(pthread_mutex_init(&_mutex,?NULL)?==?0);
}
/*
*?析造函數(shù)
*/
~Thread_Mutex()?{
//銷毀互斥量
pthread_mutex_destroy(&_mutex);
}
/*
*?加鎖
*/
void?lock?()
{
int?error;
//鎖住互斥量
error?=?pthread_mutex_lock(&_mutex);
if?(error?!=?0)
{
errno?=?error;
perror("Mutex?lock");
abort();
}
}
/*
*?解鎖
*/
void?unlock()
{
int?error;
//解鎖互斥量
error?=?pthread_mutex_unlock(&_mutex);
if?(error?!=?0)
{
errno?=?error;
perror("Mutex?unlock");
abort();
}
}
protected:
pthread_mutex_t?_mutex;
};
總結(jié)
以上是生活随笔為你收集整理的mysql lock scope_scope_lock模式详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中属性加参数_java – 具
- 下一篇: mysql 连接校对_教你轻松的掌握 M