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