这篇文章记述了关于muduo的知识点。
std::mutex
std::mutex是C11中最基本的互斥量,mutex对象 提供了独占所有权的特性。
成员函数:
构造函数:mutex不允许拷贝构造,也不允许move拷贝,最初产生的mutex对象是处于unlocked状态的。
lock(),调用线程将锁住该互斥量。线程调用该函数会发生下面3种情况:1)如果该互斥量当前没有被锁住,则调用线程将该互斥量锁住,直到调用unlock()之前,该线程将一直拥有该锁。2)如果该互斥量被其他线程锁住,则当前的调用线程被阻塞住。3)如果当前互斥量被当前调用线程锁住,则会产生死锁。
MutexLock
互斥量是线程同步常用的变量,但在实际中一般都是使用封装的函数,这样便于操作。其类图如下:
共有两个变量,mutex_是互斥量,holder_是用来表示给互斥量上锁线程的tid。
在构造函数中初始化互斥量mutex_和holder_(0),在析构函数中给销毁mutex_。对我接口根据名字很容易看出用法。
bool isLockByThisThread()是用来检查是否是当前线程给这个MutexLock对象加锁的,原理为比较holder_和 CurrentThread::tid()的值。
assingnHolder和unassignHolder分别在上锁时给holder_赋值,解锁是给holder_置零。assignHolder在上锁后调用,而unassignHolder在解锁前调用。
pthread_mutex_t* getPthreadMutex()可以返回指向类对象中互斥量的指针,在类外对互斥量操作,这个主要用在条件变量中。
在MutexLock中,还有一个类UnassignGuard,这个类中有一个MutexLock对象的引用,在其构造函数调用unassignHolder,析构函数中assignHolder,这个是为条件变量pthread_cond_wait()调用时设计的。在调用pthread_cond_wait()会解锁MuteLock,等待条件(其他线程会给MutexLock上锁)。
MutexLockGuard
在使用mutex时,有时会忘记给mutex解锁,为了防止这种情况发生,常常使用RAII手法。MutexLockGuard就是为此设计的,源码非常简单:
1 | class MutexLockGuard : boost::noncopyable |