Mutex.h
- MutexLock类:对底层互斥锁mutex进行管理
- MutexLockGuard类:对MutexLock类对象加锁解锁
头文件
noncopyable.h
CurrentThread.h,用来标识线程
assert.h,实现断言
pthread.h,线程支持
MutexLock类
在多线程编程中,为了保护共享资源,需要锁机制
MutexLock用MutexLockGuard对象进行管理,能够安全地进出每个线程的临界区
类的实现
成员变量
- 锁(互斥量):pthread_mutex_t mutex_;
- 锁的持有者(进程标识符):pid_t holder_;
类的接口
- 构造函数(实现锁的初始化)MutexLock()
- 析构函数~MutexLock()
- 加锁函数,lock()
- 解锁,unlock()
- 是否被当前线程锁住,isLockedByThisThread()
- 是否被锁的断言,assertLocked()
- 获取锁,getPthreadLock()
底层支持
锁结构:pthread_mutex_t
锁持有者:pid_t,为0时表示无人持有
初始化与销毁
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
加锁和解锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
代码实现
class MutexLock : noncopyable {
public:
MutexLock() : holder_(0) {
//初始化
pthread_mutex_init(&mutex_, NULL);
}
~MutexLock() {
//销毁,当且仅当无人持有锁时
assert(holder_ == 0);
pthread_mutex_destroy(&mutex_);
}
//锁是否被当前线程持有
bool isLockedByThisThread() {
return holder_ == CurrentThread::tid();
}
//加锁
void lock() {
pthread_mutex_lock(&mutex_);
holder_ = CurrentThread::tid();
}
//解锁
void unlock() {
//无人持有
holder_ = 0;
pthread_mutex_unlock(&mutex_);
}
pthread_mutex_t* getPthreadMutex() {
return &mutex_;
}
private:
pthread_mutex_t mutex_;
pid_t holder_;
};
MutexLockGuard类
对象化管理锁
have a MutexLock
类的接口
- 加锁:构造函数MutexLockGuard()
- 解锁:析构函数~MutexLockGuard()
类的数据
- MutexLock& mutex_;
代码实现
class MutexLockGuard: noncopyable {
public:
explicit MutexLockGuard(MutexLock& mutex) : mutex_(mutex) {
mutex_.lock();
}
~MutexLockGuard() {
mutex_.unlock();
}
private:
MutexLock& mutex_;
};
用法
{
MutexLock mutex;
MutexLockGuard lock(mutex);//加锁
}//解锁