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 | |