muduo源码解析6-condtion类
condition
- class condition:noncopyable
- {
- };
作用:
实现了最简单condtion操作,包括init,destroy,wait,notify,notifyAll,waitforseconds操作,
内部数据也很简单,mutexlock& m_mutex和pthread_cond_t m_cond
使用方法和std::cond一样
成员变量:
- private:
- mutexlock& m_mutex;
- pthread_cond_t m_cond;
成员函数:
- public:
- explicit condition(mutexlock& mutex):m_mutex(mutex)
- {
- pthread_cond_init(&m_cond,NULL);
- }
- ~condition()
- {
- pthread_cond_destroy(&m_cond);
- }
- //不满足条件时wait,把mutexlock中m_holder移除,同时该线程释放该锁
- void wait()
- {
- mutexlock::UnassignGuard ug(m_mutex);
- pthread_cond_wait(&m_cond,m_mutex.getPthreadMutex());
- }
- //等待一段时间而不是一直等待
- bool waitForSeconds(double seconds);
- //唤醒cond阻塞队列中的第一个线程
- void notify()
- {
- pthread_cond_signal(&m_cond);
- }
- //唤醒cond阻塞队列中的所有线程
- void notifyAll()
- {
- pthread_cond_broadcast(&m_cond);
- }
测试:
使用condtion和mutex完成一个生产者消费者同步的小例子。
- #include"base/mutex.h"
- #include"base/condition.h"
- #include<thread>
- #include <stdio.h>
- #include<queue>
- #include<iostream>
- #define MAXQUEUE 5
- mymuduo::mutexlock mutex;
- mymuduo::condition cond(mutex);
- std::queue<int> task_queue;
- namespace mymuduo{
- namespace currentthread {
- void cacheTid()
- {
- }
- }
- }
- void provider()
- {
- while()
- {
- std::this_thread::sleep_for(std::chrono::milliseconds());
- mymuduo::mutexlockguard mlg(mutex);
- while(task_queue.size()>=MAXQUEUE)
- cond.wait();
- task_queue.push(rand()%);
- std::cout<<"push "<<task_queue.front()<<std::endl;
- cond.notifyAll();
- }
- }
- void consumer()
- {
- while()
- {
- mymuduo::mutexlockguard mlg(mutex);
- while(task_queue.empty())
- cond.wait();
- std::cout<<"pop "<<task_queue.front()<<std::endl;
- task_queue.pop();
- cond.notifyAll();
- }
- }
- int main()
- {
- std::thread t[];
- t[]=std::thread(provider);
- t[]=std::thread(consumer);
- t[].join();t[].join();
- }
muduo源码解析6-condtion类的更多相关文章
- 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 { }: 先说一下包含的头文件 ...
- 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 ...
- java源码解析之String类(二)
上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...
随机推荐
- JVM笔记-GC常用参数设置
GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间, -Xms -Xmx 一般设置成一样大小, -XX:+UseTLAB 使用TLAB,默认打开 -XX:+Print ...
- Python 字典(Dictionary) type()方法
Python 字典(Dictionary) type()方法 描述 Python 字典(Dictionary) type() 函数返回输入的变量类型,如果变量是字典就返回字典类型.高佣联盟 www.c ...
- Java并发学习(一):进程和线程
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 俗话说得好"一人 ...
- Centos xrdp 远程连接后突然闪退
问题描述: 可以进入登录页面,但是输入用户名,密码后,直接闪退. 查看 该用户名 ~/.xsession-errors imsettings-check: ): IMSettings-WARNING ...
- 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!
最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...
- “随手记”开发记录day16
今天先对前两天增加的“修改”功能进行测试.然后进行功能的明显划分,丰富账单的添加和显示方法.
- Android Studio同时监听多个Button实现activity跳转
MainActivity.java: package com.example.test; import android.content.Intent; import android.os.Bundle ...
- 比原链(Bytom)正式开源Bytom-JavaScript库
12月13日,比原链(Bytom)正式开源Bytom-JavaScript库,这个库是官方原生支持的新一代JavaScript SDK接口.JavaScript是世界上最多人使用的解释性脚本语言,JS ...
- 博客主题推荐——复杂&简单
首先感谢原作者cjunn提供的主题autm,以下配置都基于此主题设定.很多小伙伴喜欢现在的样式,分享如下.只需简单几步即可. 如果你想使用本博客主题样式,并希望能得到远程推送更新,只需查看 快速部署. ...
- .NET Core 微服务—API网关(Ocelot) 教程 [四]
前言: 上一篇 介绍了Ocelot网关和认证服务的结合使用,本篇继续介绍Ocelot相关请求聚合和Ocelot限流 一.请求聚合 Ocelot允许声明聚合路由,这样可以把多个正常的Routes打包并映 ...