一、优雅的基石:RAII 风格的锁守卫(Lock Guard)
在 C++ 中,手动调用 lock() 和 unlock() 是非常危险的行为。一旦临界区内发生异常,或者开发者在某个分支提前 return 而忘记解锁,就会导致死锁。
为了解决这个问题,我们首先实现一个 RAII(Resource Acquisition Is Initialization)层。它的核心思想是:利用局部对象的生命周期来管理资源,在构造时加锁,在析构时解锁。
1. 读写锁 Guard 的实现
我们通过模板类来实现 ReadLockGuard 和 WriteLockGuard:
// rw_lock_guard.h
namespace cmw {
namespace base {
/**
* @brief 读锁的 RAII 封装
* @tparam RWLock 读写锁类型,需要提供 ReadLock() 和 ReadUnlock() 接口
*/
template<typename RWLock>
class ReadLockGuard {
public:
explicit ReadLockGuard(RWLock& rw_lock) : rw_lock_(rw_lock) {
rw_lock_.ReadLock(); // 构造时加读锁
}
~ReadLockGuard() {
rw_lock_.ReadUnlock(); // 析构时解读锁
}
private:
// 禁用拷贝和移动语义,防止锁的拥有权被意外转移
ReadLockGuard(const ReadLockGuard&) = delete;
ReadLockGuard& operator=(const ReadLockGuard&) = delete;
RWLock& rw_lock_;
};
/**
* @brief 写锁的 RAII 封装
* @tparam RWLock 读写锁类型,需要提供 WriteLock() 和 WriteUnlock() 接口
*/
template<typename RWLock>
class WriteLockGuard {
public:
explicit WriteLockGuard(RWLock& rw_lock) : rw_lock_(rw_lock) {
rw_lock_.WriteLock();
}
~() {
rw_lock_.();
}
:
( WriteLockGuard&) = ;
WriteLockGuard& =( WriteLockGuard&) = ;
RWLock& rw_lock_;
};
}
}


