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并 ...
随机推荐
- 1_Java语言概述
学于尚硅谷开源课程 宋红康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...
- postman~界面介绍
本文摘抄自https://www.jianshu.com/p/b8b02afa74b1 官方文档:https://learning.getpostman.com/docs/postman/launch ...
- PHP xml_set_processing_instruction_handler() 函数
定义和用法 xml_set_processing_instruction_handler() 函数规定当解析器在 XML 文档中找到处理指令时被调用的函数. 处理指令包含在 <? 和 ?> ...
- 当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮
前言 今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的. 对于这两个集合类,相信大家都不陌生,ArrayList可以说是日常开发中用的 ...
- 一文搞定Python正则表达式
本文对正则表达式和 Python 中的 re 模块进行详细讲解 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...
- Python 中 3 个不可思议的返回
第一个:神奇的字典键 some_dict = {} some_dict[5.5] = "Ruby" some_dict[5.0] = "JavaScript" ...
- linux系统中SSH免密设置报错
执行 ssh-add ~/.ssh/msi_rsa 时报下面错误 Could not open a connection to your authentication agent. 解决办法: 执行命 ...
- C# BackGroundWorker实现窗体不卡死 进度条功能
网上的例子少了好多属性的配置,改好了一个能直接用的: using System; using System.Collections.Generic; using System.ComponentMod ...
- asp.netcore 3.1 program、Startup 类详解
Program类 public class Program { /// <summary> /// 应用程序入口 /// 1.asp.netcore 本质上是控制台程序 /// </ ...
- LeetCode 646 最长数对链详解
题目描述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...