Condition Class
(muduo/base/Condition.h)& MutexLock Class
,MutexLockGuard Class
(muduo/base/Mutex.h)源码阅读
如有问题,欢迎交流!!!
MutexLock Class
单纯是对<pthread.h>
下锁的封装,但是在.h
文件中有很多宏定义。MutexLock Class
有两个数据成员:锁,pthread_mutex_t mutex_
和持有锁的线程,pid_t holder_
。该类在原有<pthread.h>
的基础上,加入了如下功能:在加锁的同时,记录加锁的线程号;在解锁时,将记录的线程号归零。
另外,MutexLock Class
的
p
r
i
v
a
t
e
private
private成员中定义了一个类UnassignGuard Class
。该类只有一个数据成员MutexLock& owner_
,但是该类不进行加锁解锁操作,只是在初始化时,置owner_
的holder_
为0(MutexLock::unassignHolder()
),在析构时,置owner_
的holder_
为当前线程号(MutexLock::assignHolder()
)。也是RAII
机制。
MutexLockGuard Class
这个是基于RAII
机制对MutexLock
的封装,即构造函数加锁,析构函数解锁。内容简单,只有一个构造函数,一个析构函数,和一个MutexLock&
类型的变量。
Condition Class
对<pthread.h>
下条件变量的封装,注意wait()
函数,它在调用pthread_cond_wait
之前先初始化了UnassignGuard Class
的变量。
问题:干嘛要初始化UnassignGuard
解答:pthrad_cond_wait
在将当前线程放入条件变量的等待序列后,会解锁,这个时候要修改该锁的MutexLock::holder_
为
0
0
0,也就是UnassignGuard Class
初始化所进行的工作;在pthread_cond_wait
返回时,会加锁,这个时候要修改该锁的MutexLock::holder_
为当前线程的线程号。
CountDownLatch Class
(闭锁?)
基于条件变量,在线程间同步count_
。
数据成员
mutable MutexLock mutex_
负责保护条件变量
condition_
和共享数据count_
的锁
Condition condition_
条件变量
int count_
共享数据
函数成员
CountDownLatch(int count)
初始化
count_
wait()
对
Condition::wait()
的封装
countDown()
对
count_
进行减一操作,如果count_==0
,则调用Condition::notifyAll()
。