高并发服务器架构笔记(3)——muduo_base 源码分析

时间:2021-08-29 18:00:37

MutexLock

MutexLock
Mutex: pthread_mutex_t
holder: pid_t (当前拥有该锁的线程 tid)
~~~~~~~~~~~~~
<< create >> MutexLock()
<< destroy >> ~MutexLock()
idLockedBythisThread(): bool 判断是否当前线程拥有该锁
assertLocked(): void (断言当前线程拥有该锁)
lock(): void
unlock(): void
getPthreadMutex(): pthread_mutex_t*
  • 在析构函数中要 assert 该锁没有被任何一个线程所使用,才能销毁这个锁

MutexLockGuard

MutexLockGuard
mutex: MutexLock&
<< create >>MutexLockGuard(mutex: MutexLock&)
<< destroy >>MutexLockGuard()

在构造函数中封装了 lock,析构函数中封装了 unlock。
使用 RAII 技法封装(Resource acquisition is initialization,资源获取就是初始化)

MutexLock mutex;
void f()
{
mutex.lock();
// 访问临界资源
if(...)
{
mutex.unlock(); // 有可能漏写
return;
}
mutex.unlock(); // 有可能漏写
}

如果漏写解锁语句,就会造成死锁。
* 使用 MutexLockGuard 可更加方便且安全

MutexLock mutex;
void f()
{
MutexLockGuard lock(mutex);
// 访问临界资源
if(...)
{

return;
}
}

MutexLock 和 MutexLockGuard 不存在整体与局部关系(聚合),只存在关联关系。MutexLockGuard 生存期结束的时候,MutexLock 的生存期还没结束。
如果两个类之间存在整体与局部关系,其中一个类还负责另一个类的构造与销毁(生存期),则为组合关系。

#define MutexLockGuard(x) error "Missing guard object name"
// 临时对象无法长时间持有锁
  • Condition
  • CountDownLatch