condition

  1. class condition:noncopyable
  2. {
  3. };

作用:

实现了最简单condtion操作,包括init,destroy,wait,notify,notifyAll,waitforseconds操作,
内部数据也很简单,mutexlock& m_mutex和pthread_cond_t m_cond
使用方法和std::cond一样

成员变量:

  1. private:
  2. mutexlock& m_mutex;
  3. pthread_cond_t m_cond;

成员函数:

  1. public:
  2. explicit condition(mutexlock& mutex):m_mutex(mutex)
  3. {
  4. pthread_cond_init(&m_cond,NULL);
  5. }
  6. ~condition()
  7. {
  8. pthread_cond_destroy(&m_cond);
  9. }
  10. //不满足条件时wait,把mutexlock中m_holder移除,同时该线程释放该锁
  11. void wait()
  12. {
  13. mutexlock::UnassignGuard ug(m_mutex);
  14. pthread_cond_wait(&m_cond,m_mutex.getPthreadMutex());
  15. }
  16.  
  17. //等待一段时间而不是一直等待
  18. bool waitForSeconds(double seconds);
  19.  
  20. //唤醒cond阻塞队列中的第一个线程
  21. void notify()
  22. {
  23. pthread_cond_signal(&m_cond);
  24. }
  25.  
  26. //唤醒cond阻塞队列中的所有线程
  27. void notifyAll()
  28. {
  29. pthread_cond_broadcast(&m_cond);
  30. }

测试:

使用condtion和mutex完成一个生产者消费者同步的小例子。

  1. #include"base/mutex.h"
  2. #include"base/condition.h"
  3. #include<thread>
  4. #include <stdio.h>
  5. #include<queue>
  6. #include<iostream>
  7.  
  8. #define MAXQUEUE 5
  9. mymuduo::mutexlock mutex;
  10. mymuduo::condition cond(mutex);
  11. std::queue<int> task_queue;
  12.  
  13. namespace mymuduo{
  14. namespace currentthread {
  15.  
  16. void cacheTid()
  17. {
  18. }
  19. }
  20. }
  21.  
  22. void provider()
  23. {
  24. while()
  25. {
  26. std::this_thread::sleep_for(std::chrono::milliseconds());
  27. mymuduo::mutexlockguard mlg(mutex);
  28. while(task_queue.size()>=MAXQUEUE)
  29. cond.wait();
  30. task_queue.push(rand()%);
  31. std::cout<<"push "<<task_queue.front()<<std::endl;
  32. cond.notifyAll();
  33. }
  34. }
  35.  
  36. void consumer()
  37. {
  38. while()
  39. {
  40. mymuduo::mutexlockguard mlg(mutex);
  41. while(task_queue.empty())
  42. cond.wait();
  43. std::cout<<"pop "<<task_queue.front()<<std::endl;
  44. task_queue.pop();
  45. cond.notifyAll();
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. std::thread t[];
  52. t[]=std::thread(provider);
  53. t[]=std::thread(consumer);
  54.  
  55. t[].join();t[].join();
  56. }

muduo源码解析6-condtion类的更多相关文章

  1. muduo源码解析5-mutex相关类

    mutexlock和mutexlockguard class mutexlock:noncopyable { }: class mutexlockguard:noncopyable { }: 作用: ...

  2. Mybatis源码解析3——核心类SqlSessionFactory,看完我悟了

    这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. ...

  3. AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍

    AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...

  4. muduo源码解析11-logger类

    logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...

  5. muduo源码解析10-logstream类

    FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...

  6. Netty源码解析 -- 内存对齐类SizeClasses

    在学习Netty内存池之前,我们先了解一下Netty的内存对齐类SizeClasses,它为Netty内存池中的内存块提供大小对齐,索引计算等服务方法. 源码分析基于Netty 4.1.52 Nett ...

  7. AOP源码解析:AspectJExpressionPointcutAdvisor类

    先看看 AspectJExpressionPointcutAdvisor 的类图 再了解一下切点(Pointcut)表达式,它指定触发advice的方法,可以精确到返回参数,参数类型,方法名 1 pa ...

  8. java源码解析之Object类

    一.Object类概述   Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解   Object的方法可以分成两类,一类是被关键字fin ...

  9. Bulma 源码解析之 .columns 类

    {说明} 这一部分的源码内容被我简化了,另外我还额外添加了一个辅助类 is-grow. .columns // 修饰类 &.is-centered justify-content: cente ...

  10. java源码解析之String类(二)

    上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...

随机推荐

  1. 1_Java语言概述

    学于尚硅谷开源课程 宋红康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...

  2. postman~界面介绍

    本文摘抄自https://www.jianshu.com/p/b8b02afa74b1 官方文档:https://learning.getpostman.com/docs/postman/launch ...

  3. PHP xml_set_processing_instruction_handler() 函数

    定义和用法 xml_set_processing_instruction_handler() 函数规定当解析器在 XML 文档中找到处理指令时被调用的函数. 处理指令包含在 <? 和 ?> ...

  4. 当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮

    前言 今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的. 对于这两个集合类,相信大家都不陌生,ArrayList可以说是日常开发中用的 ...

  5. 一文搞定Python正则表达式

    本文对正则表达式和 Python 中的 re 模块进行详细讲解 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...

  6. Python 中 3 个不可思议的返回

    第一个:神奇的字典键 some_dict = {} some_dict[5.5] = "Ruby" some_dict[5.0] = "JavaScript" ...

  7. linux系统中SSH免密设置报错

    执行 ssh-add ~/.ssh/msi_rsa 时报下面错误 Could not open a connection to your authentication agent. 解决办法: 执行命 ...

  8. C# BackGroundWorker实现窗体不卡死 进度条功能

    网上的例子少了好多属性的配置,改好了一个能直接用的: using System; using System.Collections.Generic; using System.ComponentMod ...

  9. asp.netcore 3.1 program、Startup 类详解

    Program类 public class Program { /// <summary> /// 应用程序入口 /// 1.asp.netcore 本质上是控制台程序 /// </ ...

  10. LeetCode 646 最长数对链详解

    题目描述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...