base5. MutexLock和MutexLockGuard互斥量类、Condition条件变量类、CountDownLatch倒计时门栓类(计数类)

本文主要是介绍base5. MutexLock和MutexLockGuard互斥量类、Condition条件变量类、CountDownLatch倒计时门栓类(计数类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MutexLock类图
在这里插入图片描述
数据成员:

pthread_mutex_t mutex_:pthread_mutex_t类型的线程互斥量mutex_
pid_t holder_:holder_用于保存锁拥有者的线程tid

成员函数:

MutexLock():构造函数,初始化mutex_
~MutexLock():析构函数,销毁mutex_
bool isLockedByThisThread():判断当前线程是否拥有该锁
void assertLocked():断言当前线程拥有该锁
void lock():加锁,并将holder_设置为被加锁线程的tid
void unlock():解锁,并将holder_设置为0
pthread_mutex_t* getPthreadMutex():获取mutex_数据成员

MutexLockGuard类图
在这里插入图片描述
MutexLockGuard通过RAII方式管理MutexLock资源:构造MutexLockGuard对象时,取得mutex_锁;释放对象时,释放mutex_锁。

数据成员:

MutexLock& mutex_:一个引用类型的MutexLock对象,MutexLock和MutexLockGuard是关联关系

成员函数:
explicit MutexLockGuard(MutexLock& mutex):构造函数,获取mutex_并加锁
~MutexLockGuard():析构函数,释放mutex_并解锁

Mutex.h

#ifndef MUDUO_BASE_MUTEX_H
#define MUDUO_BASE_MUTEX_H#include <muduo/base/CurrentThread.h>
#include <boost/noncopyable.hpp>
#include <assert.h>
#include <pthread.h>namespace muduo
{class MutexLock : boost::noncopyable
{public:MutexLock(): holder_(0){int ret = pthread_mutex_init(&mutex_, NULL);assert(ret == 0); (void) ret;}~MutexLock(){assert(holder_ == 0);int ret = pthread_mutex_destroy(&mutex_);assert(ret == 0); (void) ret;}//当前线程是否拥有该锁bool isLockedByThisThread(){return holder_ == CurrentThread::tid();}//断言当前线程拥有该锁void assertLocked(){assert(isLockedByThisThread());}// internal usage//加锁void lock(){pthread_mutex_lock(&mutex_);holder_ = CurrentThread::tid();}//解锁void unlock(){holder_ = 0;pthread_mutex_unlock(&mutex_);}//获取mutex_数据成员pthread_mutex_t* getPthreadMutex() /* non-const */{return &mutex_;}private://pthread_mutex_t类型的线程互斥量mutex_pthread_mutex_t mutex_;//pid_t类型的锁拥有者的线程tidpid_t holder_;
};
//MutexLockGuard更常用,自动对MutexLock对象加锁和解锁
class MutexLockGuard : boost::noncopyable
{public://构造函数中获取锁explicit MutexLockGuard(MutexLock& mutex): mutex_(mutex){mutex_.lock();}//析构函数中释放锁~MutexLockGuard(){mutex_.unlock();}private://一个引用类型的MutexLock对象,两个类是关联关系MutexLock& mutex_;
};}// Prevent misuse like:
// MutexLockGuard(mutex_);
// A tempory object doesn't hold the lock for long!//这个宏是防止MutexLockGuard(mutex_)的用法
#define MutexLockGuard(x) error "Missing guard object name"#endif  // MUDUO_BASE_MUTEX_H

Condition类图
在这里插入图片描述
数据成员:

MutexLock& mutex_:一个MutexLock类型的引用对象mutex_
pthread_cond_t pcond_:一个pthread_cond_t类型的条件变量pcond_

成员函数:
explicit Condition(MutexLock& mutex):构造函数中初始化条件变量pcond_
~Condition():析构函数中销毁条件变量pcond_
void wait():等待函数
bool waitForSeconds(int seconds):等待一定时间,超过这个时间之后就超时
void notify():调用signal函数,通知一个处于阻塞状态的线程
void notifyAll():调用broadcast函数,通知所有处于阻塞状态的线程

Condition.h

#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){pthread_cond_init(&pcond_, NULL);}//析构函数中销毁条件变量~Condition(){pthread_cond_destroy(&pcond_);}//等待函数void wait(){pthread_cond_wait(&pcond_, mutex_.getPthreadMutex());}//等待一定时间,超过这个时间之后就超时// returns true if time out, false otherwise.bool waitForSeconds(int seconds);//调用signal函数,通知一个处于阻塞状态的线程void notify(){pthread_cond_signal(&pcond_);}//调用broadcast函数,通知所有处于阻塞状态的线程void notifyAll(){pthread_cond_broadcast(&pcond_);}private://一个MutexLock类型的引用对象MutexLock& mutex_;//一个pthread_cond_t类型的条件变量pthread_cond_t pcond_;
};}
#endif  // MUDUO_BASE_CONDITION_H

Condition.cc

#include <muduo/base/Condition.h>#include <errno.h>// returns true if time out, false otherwise.
bool muduo::Condition::waitForSeconds(int seconds)
{struct timespec abstime;clock_gettime(CLOCK_REALTIME, &abstime);abstime.tv_sec += seconds;return ETIMEDOUT == pthread_cond_timedwait(&pcond_, mutex_.getPthreadMutex(), &abstime);
}

CountDownLatch类图
在这里插入图片描述
对条件变量的封装类,既可以用于所有子线程等待主线程发起 “起跑” ,也可以用于主线程等待子线程初始化完毕才开始工作。

数据成员:

mutable MutexLock mutex_:一个MutexLock锁对象,并且这个对象声明为mutable,说明其可在const函数中被修改
Condition condition_:一个Condition条件变量对象condition_
int count_:计数器count_

成员函数:

explicit CountDownLatch(int count):构造函数,用count初始化count_
void wait():等待函数,若count_>0,等待
void countDown():计数器count_减一,计数器count_==0时,唤醒所有线程
int getCount() const:获取计数器count_的值

CountDownLatch.h

//对条件变量的封装类
//既可以用于所有子线程等待主线程发起 “起跑” 
//也可以用于主线程等待子线程初始化完毕才开始工作
#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);//等待函数,count_>0,等待void wait();//计数器count_减一,计数器count_==0时,唤醒所有线程void countDown();//获取计数器count_的值int getCount() const;private://一个MutexLock锁对象,并且这个对象声明为mutable,说明其可在const函数中被修改mutable MutexLock mutex_;//一个Condition条件变量对象Condition condition_;//计数器int count_;
};}
#endif  // MUDUO_BASE_COUNTDOWNLATCH_H

CountDownLatch.cc

#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) {condition_.wait();}
}void CountDownLatch::countDown()
{MutexLockGuard lock(mutex_);--count_;if (count_ == 0) {condition_.notifyAll();}
}int CountDownLatch::getCount() const
{MutexLockGuard lock(mutex_);return count_;
}

这篇关于base5. MutexLock和MutexLockGuard互斥量类、Condition条件变量类、CountDownLatch倒计时门栓类(计数类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795649

相关文章

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo