muduo库-线程同步CountDownLatch/Condition
muduo库-线程同步CountDownLatch/Condition
多线程同步中的问题
多线程环境中,常有这样一种同步情况:一个线程等待其他所有线程完成指定工作。比如,在开启一个新线程后,虽然已经启动线程函数,很可能还有一些准备工作需要完成(如更新当前线程id,名称等信息),这样,调用线程(创建线程的线程)并不能马上投入工作,立即向新线程传递数据,可能造成未定义行为,如调用线程的某段代码依赖于子线程id。
在muduo库中使用CountDownLatch
类来解决这个问题。
Condition
Condition
类图:
Condition
类是muduo库中对系统线程条件变量类函数进行的封装;往往跟mutexlock
配合使用,但也不控制其对象的生存期。
整个condition类主要为方便用户使用,封装pthread_cond_signal为notify()
,封装pthread_cond_broadcast
为notifyAll()
;封装pthread_cond_wait
为wait()
;封装pthread_cond_timedwait
为waitForSeconds()
;
CountDownLatch
CountDownLatch
也被称为门阀 、计数器 或者
闭锁。用于多个线程之间的同步,特别是一个线程等待另一个或多个线程。CountDownLatch
类图如下:
CountDownLatch
内部持有一个向下计数的计数器count_
,构造时给定一个初值,代表需要等待的线程数。每个线程完成一个任务,count_
减1,当count_
值减到0时,代表所有线程已经完成了所有任务,在CountDownLatch
上等待的线程就可以继续执行了。
CountDownLatch的接口
需要等待其他线程完成任务的线程,调用wait()
,等待count_
变为0;
任务线程,如果完成了任务,就调用countDown()
,将count_
计数值-1
,值减到0
时,会唤醒所有等待线程继续执行;
1 |
|
CountDownLatch的实现
通过mutex_
,确保所有对count_
的操作,都是线程安全的。
1 |
|