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 核心知识点(面试版)
一.基本概念 1.1 OpenJDK 自 1996 年 JDK 1.0 发布以来,Sun 公司在大版本上发行了 JDK 1.1.JDK 1.2.JDK 1.3.JDK 1.4.JDK 5,JDK 6 ...
- amazeui 验证按钮扩展
做一个发送验证码按钮,点击后要60秒之后才能再次点击,利用原有的amazeui样式做的一些扩展,当然主题功能的代码全都是自己写的,也可以脱离amazeUi 自己完成这个功能按钮 代码如下: <! ...
- GitOps初阶指南:将DevOps扩展至K8S
本文转自Rancher Labs 在过去十年的编程中,出现了一些革命性的转变.其中之一是源于围绕DevOps的实践,它将开发和运维团队整合到一个共享的工作流程中,此外还有持续集成和持续交付(CI/CD ...
- PHP dechex() 函数
实例 把十进制转换为十六进制: <?phpecho dechex("30") . "<br>";echo dechex("10&qu ...
- PHP mysqli_thread_id() 函数
返回当前连接的线程 ID,然后杀死连接: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli ...
- 记502 dp专练
趁着503的清早 我还算清醒把昨天老师讲的内容总结一下,昨天有点迷了 至使我A的几道题都迷迷糊糊的.(可能是我太菜了) 这道题显然是 数字三角形的变形 好没有经过认真思考然后直接暴力了 这是很不应该的 ...
- 授人以渔:stm32资料查询技巧
摘要:本章以stm32f103作为案例向大家讲解arm公司和st公司的关系以及我们在对stm32开发时需要如何正确的查找手册. ARM公司和ST公司的关系 这里要从一块芯片的生产说起,比如我们要生成一 ...
- 文字识别还能这样用?通过Python做文字识别到破解图片验证码
前期准备 1. 安装包,直接在终端上输入pip指令即可: # 发送浏览器请求 pip3 install requests # 文字识别 pip3 install pytesseract # 图片处理 ...
- 【每日一个小技巧】Python | input的提示信息换行输出,提示信息用变量表示
[每日一个小技巧]Python | input的提示信息换行输出,提示信息用变量表示 在书写代码的途中,经常会实现这样功能: 请输入下列选项前的序号: 1.选择1 2.选择2 3.选择3 在pytho ...
- CI4框架应用四 - 第一个页面
我们来看一下CI4框架的默认页面是如何实现的. 我们先来认识一下路由文件(app\Config\Routes.php),这个文件非常重要,且功能强大,它定义了URL模式及响应处理方法,我们先看一下这个 ...