folly SpinLock源码分析

概述

SpinLock是对自旋锁的简单实现,因为SpinLock类仅仅是对MicroSpinLock的简单包装,所以本文主要讲述MicroSpinLock的实现。

后者的实现文件是folly/synchronization/MicroSpinLock.h。

设计-MicroSpinLock

唯一的数据成员就是一个uint8_t,它被作为一个值或为FREE或为LOCKED的原子变量使用:

struct MicroSpinLock {
   
  enum {
    FREE = 0, LOCKED = 1 };
  // lock_ can't be std::atomic<> to preserve POD-ness.
  uint8_t lock_;

  // Initialize this MSL.  It is unnecessary to call this if you
  // zero-initialize the MicroSpinLock.
  void init() noexcept {
    payload()->store(FREE); }

 private:
  std::atomic<uint8_t>* payload() noexcept {
   
    return reinterpret_cast<std::atomic<uint8_t>*>(&this->lock_);
  }

  bool cas(uint8_t compare, uint8_t newVal) noexcept {
   
    return std::atomic_compare_exchange_strong_explicit(
        payload(),
        &compare,
        newVal,
        std::memory_order_acquire,
        std::memory_order_relaxed);
  }
};

lock和unlock的实现:

struct MicroSpinLock {
   
  // ...
  bool try_lock() noexcept {
   
    bool ret = cas(FREE, LOCKED);
    annotate_rwlock_try_acquired(
        this, annotate_rwlock_level::wrlock, ret, __FILE__, __LINE__);
    return ret;
  }

  void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值