muduo源码解析7-countdownlatch类
countdownlatch
class countdownlatch:noncopyable
{
};
作用:
countdownlatch和mutex,condition一样,用于线程之间的同步,主要用于这样一种情况:
有一组线程,计算线程,IO线程1,IO线程2,
我们规定计算线程必须在所有的IO线程都结束后才能执行。
如果单纯使用mutex,计算线程可能比其他IO线程先抢到mutex,这不符合计算线程最后执行的要求。
但是可以使用条件变量来完成,当然条件变量不能单独使用,需要配套一个mutex,计算线程必须在符合条件(IO1,IO2都完成)时才能获得锁。
countdownlatch就是使用条件变量来完成的,可以初始化一个countdownlatch(2),让IO1和IO2先执行,此时
countdownlatch内部m_count值为2,计算线程向要请求锁,但是条件变量不允许,因此m_count>0,只有当IO1和IO2都完成并对m_count--后,计算线程被唤醒,发现m_count==0才可以执行。
成员变量:
private:
mutable mutexlock m_mutex;
condition m_cond;
int m_count;
分别表示:互斥锁mutex,条件变量condition和执行线程计数count
成员函数:
public:
countdownlatch(int count):m_mutex(),m_cond(m_mutex),m_count(count){} //我们要同步的那一个线程,要执行时必须先wait,只有先决线程全结束后才可以执行
void wait()
{
mutexlockguard mlg(m_mutex);
while(m_count>)
m_cond.wait();
}
//先决线程执行完毕,让引用计数--
void countDown()
{
mutexlockguard mlg(m_mutex);
m_count--;
if(m_count==)
m_cond.notifyAll();
}
//返回先决线程即引用计数的数量
int getCount() const
{
mutexlockguard mlg(m_mutex);
return m_count;
}
测试:
使用countdownlatch来测试上面的IO线程和计算线程同步的例子
#include"base/mutex.h"
#include"base/condition.h"
#include"base/countdownlatch.h"
#include<thread>
#include <stdio.h>
#include<queue>
#include<iostream> namespace mymuduo{
namespace currentthread { void cacheTid()
{
}
}
} //初始化m_count为2,表示有两个先决线程IO1和IO2
mymuduo::countdownlatch cdl(); void IOThread()
{
//IO... 2s
std::this_thread::sleep_for(std::chrono::milliseconds());
std::cout<<"IO completed...\n";
cdl.countDown();
} void computeThread()
{
//等待IO1和IO2完成后才能执行
cdl.wait();
std::cout<<"computing...\n";
} int main()
{
std::thread t1,t2,t3;
t1=std::thread(computeThread);
t2=std::thread(IOThread);
t3=std::thread(IOThread); t1.join();t2.join();t3.join(); }
计算结果:
不用想,computing...肯定在最后出现
IO completed...
IO completed...
computing...
muduo源码解析7-countdownlatch类的更多相关文章
- muduo源码解析5-mutex相关类
mutexlock和mutexlockguard class mutexlock:noncopyable { }: class mutexlockguard:noncopyable { }: 作用: ...
- Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了
这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...
- AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍
AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...
- muduo源码解析11-logger类
logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...
- muduo源码解析10-logstream类
FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...
- 【JUC源码解析】CountDownLatch
简介 CountDownLatch,是一个同步器,允许一个或多个线程等待,直到一组操作在其他线程中完成. 概述 初始CountDownLatch时,会给定count,await方法会阻塞,直到coun ...
- Netty源码解析 -- 内存对齐类SizeClasses
在学习Netty内存池之前,我们先了解一下Netty的内存对齐类SizeClasses,它为Netty内存池中的内存块提供大小对齐,索引计算等服务方法. 源码分析基于Netty 4.1.52 Nett ...
- AOP源码解析:AspectJExpressionPointcutAdvisor类
先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...
- java源码解析之Object类
一.Object类概述 Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解 Object的方法可以分成两类,一类是被关键字fin ...
- Bulma 源码解析之 .columns 类
{说明} 这一部分的源码内容被我简化了,另外我还额外添加了一个辅助类 is-grow. .columns // 修饰类 &.is-centered justify-content: cente ...
随机推荐
- 5-Pandas之常用的描述性统计函数、汇总函数
一.常用的描述性统计函数 函数 作用 函数 作用 count 非缺失样本的数量 sum 求和 mean 均值 mad 平均绝对偏差(Mean absolute deviation) median 中 ...
- springboot多数据源启动报错:required a single bean, but 6 were found:
技术群: 816227112 参考:https://stackoverflow.com/questions/43455869/could-not-autowire-there-is-more-than ...
- 虹软人脸识别—版本升级接口修改说明(C#)
自虹软发布了免费.离线版本人脸识别SDK,在Github上陆续分享了各个版本对应的 C# Demo.因为公司项目一直在使用虹软的SDK,因此每当虹软官网有新版本发布,我都会进行了解,并结合Demo进行 ...
- 【AHOI2009】同类分布 题解(数位DP)
题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$p ...
- python1.2元组与字典:
#定义元组(),元组与列表类似但元素不可以更改a=(1,2,3,4,5,6,"a","b","c","d"," ...
- Hotspot GC研发工程师也许漏掉了一块逻辑
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 今天要说的这个问题,是我经常面试问的一个问题,只是和我之前排查过的场景有些区别,属于另外一种情况.也许我这里讲了这个之后,会成为不 ...
- 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!
修改jar包配置文件的正确操作,有的时候通过一些解压工具可以对内部的文件进行修改,但是有时候会无效.这就很烦了 一.背景: 有一个springboot项目,事先我已经用编译好打成jar包以 ...
- NLP Github
作者:cstghitpku链接:https://zhuanlan.zhihu.com/p/51279338来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.分词 Wo ...
- 06 大数据CentOS6.5mini安装与网络配置
1. CentOS6.5mini安装 文件>>新建虚拟机 选择自定义,下一步 默认,下一步 选择稍后安装操作系统,下一步 选择CentOS版本,下一步 给虚拟机命名,这个是在VMWare中 ...
- Flutter 容器 (1) - Center
Center容器用来居中widget import 'package:flutter/material.dart'; class AuthList extends StatelessWidget { ...