概述
確切的說,區域鎖(Scoped locking)不是一種鎖的類型,而是一種鎖的使用模式(pattern)。這個名詞是Douglas C. Schmidt於1998年在其論文Scoped Locking提出,並在ACE框架裏面使用。但作爲一種設計思想,這種鎖模式應該在更早之前就被業界廣泛使用了。
區域鎖實際上是RAII模式在鎖上面的具體應用。RAII(Resource Acquisition Is Initialization)翻譯成中文叫“資源獲取即初始化”,最早是由C++的發明者 Bjarne Stroustrup爲解決C++中資源分配與銷燬問題而提出的。RAII的基本含義就是:C++中的資源(例如內存,文件句柄等等)應該由對象來管理,資源在對象的構造函數中初始化,並在對象的析構函數中被釋放。STL中的智能指針就是RAII的一個具體應用。RAII在C++中使用如此廣泛,甚至可以說,不會RAII的裁縫不是一個好程序員。
區域鎖就是把鎖封裝到一個對象裏面。鎖的初始化放到構造函數,鎖的釋放放到析構函數。這樣當鎖離開作用域時,析構函數會自動釋放鎖。即使運行時拋出異常,由於析構函數仍然會自動運行,所以鎖仍然能自動釋放。
實現代碼
/**
* @brief 局部鎖的模板實現
*/
template<class T>
struct ScopedLockImpl {
public:
/**
* @brief 構造函數
* @param[in] mutex Mutex
*/
ScopedLockImpl(T& mutex)
:m_mutex(mutex) {
m_mutex.lock();
m_locked = true;
}
/**
* @brief 析構函數,自動釋放鎖
*/
~ScopedLockImpl() {
unlock();
}
/**
* @brief 加鎖
*/
void lock() {
if (!m_locked) {
m_mutex.lock();
m_locked = true;
}
}
/**
* @brief 解鎖
*/
void unlock() {
if (m_locked) {
m_mutex.unlock();
m_locked = false;
}
}
private:
/// mutex
T& m_mutex;
/// 是否已上鎖
bool m_locked;
};
/**
* @brief 互斥量
*/
class Mutex : Noncopyable {
public:
/// 局部鎖
typedef ScopedLockImpl<Mutex> Lock;
/**
* @brief 構造函數
*/
Mutex() {
pthread_mutex_init(&m_mutex, nullptr);
}
/**
* @brief 析構函數
*/
~Mutex() {
pthread_mutex_destroy(&m_mutex);
}
/**
* @brief 加鎖
*/
void lock() {
pthread_mutex_lock(&m_mutex);
}
/**
* @brief 解鎖
*/
void unlock() {
pthread_mutex_unlock(&m_mutex);
}
private:
/// mutex
pthread_mutex_t m_mutex;
};
參考資料:https://blog.csdn.net/zouxinfox/article/details/5848519