base::LockImpl,是base::Lock和base::AutoLock的底层实现。
此类实现用于Lock类的平台特定的自旋锁定机制。大多数代码不会直接使用LockImpl,而是使用Lock。
LockImpl实现了四个简单的成员函数,分别是:
1- Try(),如果锁未被持有,则获取它并返回true。如果锁已经被其他东西持有,立即返回false。
2- Lock(),获取锁,如有必要,阻塞到可用为止。
3- Unlock(), 在成功调用Try或调用Lock之后调用解锁,这只能由锁的持有者调用。
4- native_handle(),获取native handle。
NativeHandle即一个简单的封装:
struct CHROME_SRWLOCK {
PVOID Ptr;
};
#if defined(OS_WIN)
using NativeHandle = CHROME_SRWLOCK;
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
using NativeHandle = pthread_mutex_t;
#endifbase::Lock, 构造函数和析构函数均为空。内部使用一个base::LockImpl来完成加锁。它实现了一个跨系统的Critical Section解决方案。
实现了如下语义,注意,获取和释放使用的分别是Acquire和Release,而不是Lock和Unlock:
//获取
void Acquire() { lock_.Lock(); }
//释放
void Release() { lock_.Unlock(); }
//尝试
bool Try() { return lock_.Try(); }
//当未持有锁时,产生assert(abort),仅调试模式
void AssertAcquired() const {}base::AutoLock,使用AutoLock(Lock& lock)方式构造时,调用lock.Acquire()上锁。
AutoLock(Lock& lock, const AlreadyAcquired&)方式构造时,调用lock_.AssertAcquired()。
在析构时,调用lock_.AssertAcquired()和lock_.Release()去锁。因此AutoLock适合在栈上使用。