muduo库的Condition类和CountDownLatch类剖析

Base——Condition类、CountDownLatch类 1.成员变量 Condition类 mutex_为引用,该类并不管理该成员变量的生命周期 CountDownLatch类 mutable关键字: 知乎 mutable意思是“这个成员变量不算对象内部状态”。比如,你搞了个变量,用来统计某个对象的访问次数(比如供debug用)。它变成什么显然并不影响对象功用,但编译器并不知道:它仍然会阻止一个声明为const的函数修改这个变量。把这... 阅读详情


condition类是封装了条件变量的操作,我以前在做服务器项目的时候也实现过封装condition。


它的实现如下:

#ifndef MUDUO_BASE_CONDITION_H
#define MUDUO_BASE_CONDITION_H

#include <muduo/base/Mutex.h>

#include <boost/noncopyable.hpp>
#include <pthread.h>

namespace muduo
{

class Condition : boost::noncopyable
{
 public:
  explicit Condition(MutexLock& mutex)
    : mutex_(mutex)
  {
    MCHECK(pthread_cond_init(&pcond_, NULL));  //初始化
  }

  ~Condition()
  {
    MCHECK(pthread_cond_destroy(&pcond_));   //销毁
  }

  void wait()                      //pthread_cond_wait
  {
    MutexLock::UnassignGuard ug(mutex_);
    MCHECK(pthread_cond_wait(&pcond_, mutex_.getPthreadMutex()));
  }

  // returns true if time out, false otherwise.
  bool waitForSeconds(double seconds);

  void notify()
  {
    MCHECK(pthread_cond_signal(&pcond_));   //一对一
  }

  void notifyAll()
  {
    MCHECK(pthread_cond_broadcast(&pcond_));   //广播
  }

 private:
  MutexLock& mutex_;
  pthread_cond_t pcond_;
};

}
#endif  // MUDUO_BASE_CONDITION_H


我们有时对Condition类上面再套一层封装来使用,他就是我们的CountDownLatch类。通过倒计时计数器的方式,设置计数。倒计时未完,CountDownLatch的内部一直处于

Condition类的wait()状态。倒计时完毕,唤醒cond,程序正常执行。所以我们可以给某件即将发生的事设置一个条件,比如至少5个满足才会触发该事件,那么计数值设为5,

等到倒计时为0时,CountDownLatch类就可以让你顺利的去执行该事件了。


所以它主要有两个用法:

1.既可以用于所有子线程主动等待主线程发起“起跑”

2.也可以用于主线哼等待子线程初始化完毕才开始工作


它的类图如下:



它的实现如下:

#ifndef MUDUO_BASE_COUNTDOWNLATCH_H
#define MUDUO_BASE_COUNTDOWNLATCH_H

#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>

#include <boost/noncopyable.hpp>

namespace muduo
{

class CountDownLatch : boost::noncopyable
{
 public:

  explicit CountDownLatch(int count);  //传递一个计数器

  void wait();

  void countDown();

  int getCount() const;

 private:             //CountDownLatch由一把锁,条件变量,计数器构成
  mutable MutexLock mutex_;
  Condition condition_;
  int count_;
};

}
#endif  // MUDUO_BASE_COUNTDOWNLATCH_H

以及:

#include <muduo/base/CountDownLatch.h>

using namespace muduo;

CountDownLatch::CountDownLatch(int count)
  : mutex_(),
    condition_(mutex_),   //初始化,条件变量用成员锁初始化
    count_(count)
{
}

void CountDownLatch::wait()
{
  MutexLockGuard lock(mutex_);
  while (count_ > 0)    //只要计数值大于0,CountDownLatch类就不工作,知道等待计数值为0
  {
    condition_.wait();
  }
}

void CountDownLatch::countDown()  //倒数,倒计时
{
  MutexLockGuard lock(mutex_);
  --count_;
  if (count_ == 0)
  {
    condition_.notifyAll();
  }
}

int CountDownLatch::getCount() const  //获得次数
{
  MutexLockGuard lock(mutex_);
  return count_;
}




Java Web 图书管理系统的制作指南 实现对图书信息的增删改查(CRUD)操作。支持用户登录与权限管理。图书借阅与归还功能。系统管理员可以管理用户信息和图书库存。 阅读详情

相关推荐

Kubernetes集群资源优化实战:Volcano调度器如何帮你省下30%GPU算力

本文详细介绍了如何通过Volcano调度器的Binpack策略优化Kubernetes集群中的GPU资源利用率,解决AI模型训练中的资源碎片化问题。通过实战配置和调优指南,帮助用户提升30%的GPU算力利用率,显著降低任务等待时间和硬件成本。

weixin_30832143的博客 507

【AQS源码】condition、CountDownLatch、CyclicBarrier、中断、共享等

导言: 大家应该都或多或少学习过Reentranlock的源码,说实话AQS相关的阻塞队列、调价队列、排它锁、共享锁的阅读还是需要花时间细心看的,本文希望能梳理思路,方便你真正读代码时不至于绕迷糊。 本文基于我的思维导图来讲解:https://www.processon.com/view/link/5ede205d5653bb6963dc6d56 一、从Reentranlock说起 0、名词解释 代码中有些函数的命名规则 lock()代表是最高层的加锁API,他调用acquire acquire是第二高的

努力充实,远方可期 3230

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1599

Java并发编程实战--闭锁 CountDownLatch

闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。 闭锁可以用来确保某些活动直到其他活动都完成后才继续执行。 CountDownLatch是一种灵活的闭锁实现,可以在上述各

勿忘初心 1644

Fluent 2.5D动网格重构实战:涡旋压缩机复杂运动模拟指南

本文详细解析了Fluent 2.5D动网格重构技术在涡旋压缩机复杂运动模拟中的应用。通过对比传统方法,2.5D重构显著提升了计算效率和稳定性,特别适用于柱体类几何的网格处理。文章提供了从基础配置到参数优化的实战指南,包括关键设置步骤、常见问题排查及性能优化策略,帮助工程师有效解决动网格重构中的负体积和网格畸变问题。

weixin_28455801的博客 549

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

gcd,lcm

罗勇军的博客 7604

C++11实现一个countdown latch

在日常生活中,我们经常遇到这样场景,当要做一件事情时,要先等待几个固定数目的其它事情做完了,才能进行,如果别的事情没有就绪,只能等待。比如,一个工厂有存放原材料的仓库,仓库的大门共有三把锁,分别由仓管员、主管部门经理和值班经理保管,当一个(或几个)领料员上班后去仓库领材料,发现仓库大门锁着,那么他就只能等着这三个掌管钥匙的人员来开门:如果主管部门经理来上班了,就把他负责的那把锁打开,然后去工作了,此时领料员只能继续等待,当值班经理来上班之后,把他负责的那把锁打开,然后也去工作了,只有最后仓管员上班之后打开最

moter的专栏 3532

2、TrustZone(内含链接)——长期学习内容

ARM系列学习路径整理,希望对大家有用。

HoneyIC的博客 232

java并发包学习系列:线程复用之线程池

频繁使用new Thread来创建线程的方式并不太好。因为每次new Thread新建和销毁对象性能较差,线程缺乏统一管理。好在Java提供了线程池,它能够有效的管理、调度线程,避免过多的资源消耗。优点如下:

有心好书 5605

2026华为OD机试 新系统真题题库目录|机考题库 + 算法考点详解

华为OD机试 新系统真题题库目录|机考题库 + 算法考点详解华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2024年最新题库,

KJ.JK 4702

【Altium designer】如何添加过孔阵列

按下图1指示,执行【Tool】菜单栏下【Via Stitching/Shielding】选项卡中的【Add Stitching to Net...】选项 图1 “添加过孔阵列”选项 点击【Add Stitching to Net...】选项后,会跳出一个窗口,让我们设置过孔阵列的参数信息,如下图2所示。 图2 过孔阵列参数设置 过孔阵列区域:勾选该选项框,即可绘制多边形区域; 过孔内径与焊盘直径:比如内径 【Hole Size】设为12mil,焊盘直径【Diameter】设为24mil; .

夜半少年的博客 2万+

CountDownLatch的学习

闭锁,一个大门,满足一定的条件后开门(8点了开学校大门)。 /** * 闭锁 */ public class TestHarness {//创建一些线程,并发的执行给定的任务 //每一个工作线程要做的第一件事是等待开始门阀打开,这样做能确保 //所有线程都做好准备时,才开始工作。 //每个线程的最后一个工作是结束门阀减1,这样做使控制线程有效的等待, // 直...

weixin_43671840的博客 221

ESP32-C3入门教程 蓝牙篇①——基于Blufi 的 WiFi 智能配网

文章目录一、前言二、WiFi配网方式三、快速运行四、运行效果五、ESP32-C3程序流程5.1 主程序5.2 回调函数5.3 SmartConfig线程5.4 流程图六、关键函数6.1 设置SmartConfig的协议类型6.2 启动SmartConfig6.3 停止SmartConfig七、其他八、参考 一、前言 本文基于VS Code IDE进行编程、编译、下载、运行等操作 基础知识点请查阅:ESP32-C3入门教程 基础篇①——基于VS Code构建Hello World 二、WiFi配网方式 W

7765

【muduo/base】线程同步类

前言 muduo库也对线程同步原语封装了一下,为下面三个类: (1) MutexLock (2)Condition (3) CountDownLatch 我将简化类,或以伪代码的形式作为讲解 mutex类 简化后的代码 class MutexLock : noncopyable { public: MutexLock() { //pthread_mutex_init 系统调用 初始化一个锁 MCHECK(pthread_mutex_init(&mutex_, NULL));

mumu 287

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Muduo之Mutex、Condition、CountDownlatch解析及例子讲解

首先看看Mutex的源码 namespace muduo { // Use as data member of a class, eg. // // class Foo // { // public: // int size() const; // // private: // mutable MutexLock mutex_; // std::vector&lt;int&gt;...

大洋深处 628

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

muduo库学习笔记八:base库之Condition

Condition类:是muduo库中对系统线程条件变量类函数进行的封装;往往跟mutexlock配合使用, 但也不控制其对象的生存期。 类图: 条件变量使用规范为: wait函数主要工作为: 整个condition类主要为方便用户使用,封装pthread_cond_signal为notify(),封装pthread...

mazi的博客 365

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

muduoku 学习篇- condition类学习

在上一篇博客学习了muduo库对线程的封装,并且留了一个小尾巴,在muduo的线程类里面有一个成员变量是CountDownLatch类型,打开这个类可以看到这个类主要是对条件变量的封装。所以先学习muduo库对条件变量的封装。 conditon.h #ifndef MUDUO_BASE_CONDITION_H #define MUDUO_BASE_CONDITION_H #include "mud...

len_yue_mo_fu的博客 374

muduo之CountDownLatch.cc

CountDownLatch用线程同步的。 CountDownLatch.h // Use of this source code is governed by a BSD-style license // that can be found in the License file. // // Author: Shuo Chen (chenshuo at chenshuo ...

1万+

muduo源码阅读(4):Mutex相关类, Condition类和CountDownLatch类

muduo中对互斥量和条件变量的操作基本上都是调用它们对应的相关函数来实现的。例如MutexLock::lock()即调用pthread_mutex_lock(),Condition::wait()即调用pthread_cond_wait()等等

John的博客 203

muduo学习笔记:base部分之Atomic、Mutex、Condition、CountDownlatch等线程相关类

muduo库中线程同步异步需要基本组件Atomic、Mutex、Condition、CountDownlatch,在Thread、ThreadPool、BlockQueue等基本组件中均有使用。前三者主要用于线程间同步、保护资源竞争,使用C语言的方式实现;后者CountDownlatch利用前三者,实现等待多任务或多线程执行准备就绪后通知当前线程继续执行的功能。 在c++11中,可以直接使用 std::atomic<>、std::mutex、std::condition_variable等来实现

热爱生活,忠于自己 707

解析muduo源码之 CountDownLatch.h & CountDownLatch.cc

本文详细解析了Muduo网络库中CountDownLatch的实现,这是一个基于互斥锁和条件变量的线程同步工具。文章首先介绍了CountDownLatch的类定义和核心功能,包括wait()、countDown()和getCount()三个主要接口。随后深入剖析了实现细节,重点讲解了RAII锁管理、while循环防止虚假唤醒、notifyAll()确保唤醒所有等待线程等关键设计。文章还通过典型场景示例说明了CountDownLatch的使用方法,并总结了其线程安全、语义清晰等设计亮点,以及不可重复使用等注意

m0_62807361的博客 628

muduo 笔记

文章目录base库copyable、noncopyableAtomicTimestampDateMutexConditionCountDownLatchThreadCurrentThreadExceptionBlockingQueueStringPieceLogStreamLoggingnet库EndianInetAddressSocketsOpsSocketChannelPollerEventLoopTimerQueueAcceptorTcpConnectionConnectorBufferTcpServ

Running Bit. 991

muduo网络库源码复现笔记(五):base库的Mutex.h和Condition.h和CoutntDownLatch.h

Muduo网络库简介 muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。 muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的

梁熙民的csdn博客 463

1.muduo安装使用与源码阅读说明

1.源码阅读说明 本人是在具有C++基础和Linux系统与网络编程基础的情况下阅读muduo源码,如果对Linux网络编程不熟悉,最好先学习一下Linux网络编程 阅读时可以参考<muduo网络库使用手册>,这个一搜就能搜到,对muduo整体的框架有讲解,能帮助理解Buffer,TcpConnection等类,可以先读读这个再看源码 这里写的代码阅读笔记,只是对阅读源码的辅...

LvPartner的博客 2005

muduo_base库学习笔记6——互斥量、条件变量和倒计时门闩类

muduo中对互斥量和条件变量的操作基本上都是调用它们对应的相关函数来实现的,例如MutexLock::lock即调用pthread_mutex_lock(), Condition::wait()即调用pthread_cond_wait等 互斥量 muduo封装了MutexLock和MutexLockGuard MutexLock封装临界区,它是一个简单的资源类,用RAII手法封装互斥量的创建与销毁,一般是别的类的数据成员 MutexLockGuard封装临界区的进入和退出,即加锁和解锁,它一般是个栈上对象

qq_37299596的博客 321

muduo库源码学习(base)CountDownLatch

#ifndef MUDUO_BASE_COUNTDOWNLATCH_H #define MUDUO_BASE_COUNTDOWNLATCH_H #include "./Condition.h" #include "./Mutex.h" #include namespace muduo { class CountDownLatch : boost::noncopyable//CountDo

lsaejn的专栏 447
上一篇: 多线程程序与fork()分析
下一篇: muduo库的BlockingQueue和BoundBlockingQueue类剖析
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值