概述
确切的说,区域锁(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