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 ...
随机推荐
- 进度条函数 -------ajax初试
做一个显示任务完成情况的进度条: <!DOCTYPE html> <html> <head> <meta charset="utf-8"& ...
- iOS 高效灵活地配置可复用视图组件的主题
本文首发于 Ficow Shen's Blog,原文地址: iOS 高效灵活地配置可复用视图组件的主题. 内容概览 前言 如何配置主题? 如何更高效地配置主题? 面向协议/接口的方案 ...
- github提交报错
github正确提交步骤 https://www.cnblogs.com/alex-415/p/6912294.html 可能的错误 提交前没有先pull,主要的原因是在创建repository的时候 ...
- Get与Post的区别?(面试官最想听到的答案)
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- matplotlib 去掉坐标轴
#去掉x轴 plt.xticks([]) #去掉y轴 plt.yticks([]) #去掉坐标轴 plt.axis('off') 2020-06-26
- PHP count_chars() 函数
实例 返回一个字符串,包含所有在 "Hello World!" 中使用过的不同字符(模式 3): <?php高佣联盟 www.cgewang.com$str = " ...
- 实验09——java基于TCP实现客户端与服务端通信
TCP通信 需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手 底层通过 流 发送数据 数据没有大小限制 可靠的传输机制 - 丢包重发 包的顺序的 ...
- Android Studio局部管理器
1.LinearLayout(线性布局) 该布局将其中的View子控件按照水平或者垂直方向排列.但是需要注意不管是水平还是竖直,对应的每一行或列都只能放一个控件. 线性布局两种排法: 从左到右:and ...
- 用python分析1225万条淘宝数据,终于搞清楚了我的交易行为
大家好,我是黄同学
- 补充的javascript 数据类型笔记
<p> 变量名命名规范</p> 由字母,数字,下划线,$组成 严格区分大小写 var app和var App 是两个变量 变量名不能以数字开头 ...