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

本文分析了muduo_base库中的MutexLock和MutexLockGuard,重点介绍了MutexLock的析构安全性及MutexLockGuard的RAII特性,揭示了它们之间的关联而非组合关系。同时,提到了Condition和CountDownLatch在高并发场景中的作用。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值