// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)
#ifndef MUDUO_BASE_MUTEX_H
#define MUDUO_BASE_MUTEX_H
#include <muduo/base/CurrentThread.h>
#include <boost/noncopyable.hpp>
#include <assert.h>
#include <pthread.h>
namespace muduo
{
// MutexLock用构造函数和析构函数分别封装了 pthread_mutex_t
// 初始化和销毁,是RAII的思想
class MutexLock : boost::noncopyable
// 继承 noncopyable 主要是为了禁止拷贝构造和赋值运算符,
// noncopyable基类中,拷贝构造函数和赋值运算符被声明为私有成员,
// 从而禁止了拷贝和赋值
{
public:
MutexLock()
: holder_(0)
{
int ret = pthread_mutex_init(&mutex_, NULL);
assert(ret == 0); (void) ret;
}
~MutexLock()
{
assert(holder_ == 0);
int ret = pthread_mutex_destroy(&mutex_);
assert(ret == 0); (void) ret;
}
bool isLockedByThisThread()
{
return holder_ == CurrentThread::tid();
}
void assertLocked()
{
assert(isLockedByThisThread());
}
// internal usage
void lock()
{
pthread_mutex_lock(&mutex_);
holder_ = CurrentThread::tid();
}
void unlock()
{
holder_ = 0;
pthread_mutex_unlock(&mutex_);
}
pthread_mutex_t* getPthreadMutex() /* non-const */
{
return &mutex_;
}
private:
pthread_mutex_t mutex_;
pid_t holder_;
};
// MutexLockGuard 的主要思想也是RAII,
// 将MutexLock的初始化以及加锁放到构造函数中,
// 把解锁过程放到析构函数中,这样当MutexLockGuard离开作用域的时候,
// 就会自动将锁释放掉,从而省去了手动释放的过程。
// 与C++11 std::lock_guard 功能类似
class MutexLockGuard : boost::noncopyable
{
public:
explicit MutexLockGuard(MutexLock& mutex)
: mutex_(mutex)
{
mutex_.lock();
}
~MutexLockGuard()
{
mutex_.unlock();
}
private:
MutexLock& mutex_;
};
}
// Prevent misuse like:
// MutexLockGuard(mutex_);
// A tempory object doesn't hold the lock for long!
#define MutexLockGuard(x) error "Missing guard object name"
#endif // MUDUO_BASE_MUTEX_H
关注我的公众号