5

Folly 的 MicroLock 使用方法和实现

 3 years ago
source link: https://zhiqiang.org/coding/folly-micro-lock.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Folly 的 MicroLock 使用方法和实现

作者: 张志强

, 发表于 2019-11-30

, 共 695 字 , 共阅读 109 次

由 Facebook 开发和维护的 C++库 Folly 提供了锁folly::MicroLock,代码文件地址:https://github.com/facebook/folly/blob/master/folly/MicroLock.h

folly::MicroLock小到只有一个字节,并且为POD类型。

根据 Facebook 的测试,该锁单次耗时约 27ns ,略高于std::mutex的 25ns ,参考的虚函数单次调用耗时约 1.7ns。不过既然还慢于std::mutex,那么MicroLock存在的价值是什么呢?

它的价值在于它很小,小到只有一个字节,却可以提供 4 个锁。每个锁占用 2 个位。如果只用最开头的一个锁,那么它可以小到 2 个位,这样可以共享其它数据的低位,比如指针(由于数据按 4 位对齐,对于大多数指针的末两位都是 0 ):

union Pointer {
  folly::MicroLock lock;
  void* _ptr;

  void* get_ptr() const {
    return _ptr & ~(3);
  }

  void set_ptr(void* ptr) {
    _ptr = ptr | (_ptr & 3);
  }

  void lock() {
    lock.lock();
  }

  void unlock() {
    lock.unlock();
  }
}

为什么一个锁需要两个位,还没看明白。似乎是一个位保存hold状态,另一个位保存wait状态。

Q. E. D.

avatar-0.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK