UML类图:
解释:
供我们使用的是lock()和unlock()这两个函数,与Linux自带的互斥量使用方法类似。
需要解释的是holder_,这个变量使用来记录当时锁住锁的线程的tid,如果没有任何线程锁住锁它的值为0。就是通过这种方式来体现MutexLock的上锁和解锁的。在源码中是这样体现的:
void lock() ACQUIRE()
{
MCHECK(pthread_mutex_lock(&mutex_));//这两句话的顺序很有讲究
assignHolder(); //将当前线程的tid,赋值给holder_
}
void unlock() RELEASE()
{
unassignHolder(); //将holder_赋值为0
MCHECK(pthread_mutex_unlock(&mutex_));
}
在源码中MutexLock类中还定义了这个类:
private:
friend class Condition;
class UnassignGuard : noncopyable
{
public:
explicit UnassignGuard(MutexLock& owner)
: owner_(owner)
{
owner_.unassignHolder();
}
~UnassignGuard()
{
owner_.assignHolder();
}
private:
MutexLock& owner_;
};
UnassignGuard这个类只在Condition类中实现,具体解释在Condition类中解释。