LevelDB的互斥量与条件变量
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的互斥量与条件变量的主要内容,如果未能解决你的问题,请参考以下文章