Chromium Base - LockImpl, NativeHandle, Lock, AutoLock

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解决方案。


实现了如下语义,注意,获取和释放使用的分别是AcquireRelease,而不是LockUnlock

   //获取
  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适合在栈上使用。