由 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.