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; #endif
base::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适合在栈上使用。