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. JVM笔记-GC常用参数设置

    GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间, -Xms -Xmx 一般设置成一样大小, -XX:+UseTLAB 使用TLAB,默认打开 -XX:+Print ...

  2. Python 字典(Dictionary) type()方法

    Python 字典(Dictionary) type()方法 描述 Python 字典(Dictionary) type() 函数返回输入的变量类型,如果变量是字典就返回字典类型.高佣联盟 www.c ...

  3. Java并发学习(一):进程和线程

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 俗话说得好"一人 ...

  4. Centos xrdp 远程连接后突然闪退

    问题描述: 可以进入登录页面,但是输入用户名,密码后,直接闪退. 查看 该用户名  ~/.xsession-errors imsettings-check: ): IMSettings-WARNING ...

  5. 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!

    最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...

  6. “随手记”开发记录day16

    今天先对前两天增加的“修改”功能进行测试.然后进行功能的明显划分,丰富账单的添加和显示方法.

  7. Android Studio同时监听多个Button实现activity跳转

    MainActivity.java: package com.example.test; import android.content.Intent; import android.os.Bundle ...

  8. 比原链(Bytom)正式开源Bytom-JavaScript库

    12月13日,比原链(Bytom)正式开源Bytom-JavaScript库,这个库是官方原生支持的新一代JavaScript SDK接口.JavaScript是世界上最多人使用的解释性脚本语言,JS ...

  9. 博客主题推荐——复杂&简单

    首先感谢原作者cjunn提供的主题autm,以下配置都基于此主题设定.很多小伙伴喜欢现在的样式,分享如下.只需简单几步即可. 如果你想使用本博客主题样式,并希望能得到远程推送更新,只需查看 快速部署. ...

  10. .NET Core 微服务—API网关(Ocelot) 教程 [四]

    前言: 上一篇 介绍了Ocelot网关和认证服务的结合使用,本篇继续介绍Ocelot相关请求聚合和Ocelot限流 一.请求聚合 Ocelot允许声明聚合路由,这样可以把多个正常的Routes打包并映 ...