![](/style/images/good.png)
![](/style/images/bad.png)
Folly 的 MicroLock 使用方法和实现
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 使用方法和实现
由 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](https://zhiqiang.org/static/img/avatar-0.jpg)
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK