LevelDB的互斥量与条件变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LevelDB的互斥量与条件变量相关的知识,希望对你有一定的参考价值。

LevelDB的互斥量与条件变量

namespace leveldb{
namespace port{
class CondVar;

// Thinly wraps std::mutex.
    // 简单封装了c++的std::mutex
class LOCKABLE Mutex {
 public:
  Mutex() = default;
  ~Mutex() = default;

  Mutex(const Mutex&) = delete;
  Mutex& operator=(const Mutex&) = delete;

  void Lock() EXCLUSIVE_LOCK_FUNCTION() { mu_.lock(); }
  void Unlock() UNLOCK_FUNCTION() { mu_.unlock(); }
  void AssertHeld() ASSERT_EXCLUSIVE_LOCK() {}

 private:
  friend class CondVar;
  std::mutex mu_;
};
// Thinly wraps std::condition_variable.
    //简单封装了c++的std::condition_variable
class CondVar {
 public:
  explicit CondVar(Mutex* mu) : mu_(mu) { assert(mu != nullptr); }
  ~CondVar() = default;

  CondVar(const CondVar&) = delete;
  CondVar& operator=(const CondVar&) = delete;

  void Wait() {
      //std::unique_lock的第二个参数是std::adopt_lock,表示传入unique_lock的互斥量mu_->mu需要在传入之前自己加锁,如果不能加锁就在这里阻塞等待。因此在unique_lock的构造函数中不会自动为这个互斥量mu_->mu_加锁。
    std::unique_lock<std::mutex> lock(mu_->mu_, std::adopt_lock);
      //wait()会对互斥量解锁。
      //wait()对互斥量解锁以后,会阻塞在这里,直到notify_one()或者notify_all()来唤醒线程
      //唤醒了线程以后,会尝试再次对互斥量加锁,加锁成功以后才继续向下执行,加锁失败继续阻塞
      // wait()还可以有第二个参数,他是一个可调用类型
    cv_.wait(lock);
      //接触unique_lock与互斥量的绑定。在unique_lock的析构函数中会检测互斥量是否已经解锁,如果没有解锁,那么他会自动解锁
    lock.release();
  }
  void Signal() { cv_.notify_one(); }
  void SignalAll() { cv_.notify_all(); }

 private:
  std::condition_variable cv_;
  Mutex* const mu_;
};
}
}

以上是关于LevelDB的互斥量与条件变量的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁自旋锁读写锁和条件变量

C++11多线程 互斥量与Windows临界区

忙等待中的互斥

蓝桥ROS机器人之现代C++学习笔记7.2 互斥量与临界区

C++ 11 互斥量与死锁

第29课 互斥量与自解锁(std::mutex和lock系列)