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

相关文章

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

基于Python和Tkinter实现高考倒计时功能

《基于Python和Tkinter实现高考倒计时功能》随着高考的临近,每个考生都在紧锣密鼓地复习,这时候,一款实用的倒计时软件能有效帮助你规划剩余时间,提醒你不要浪费每一分每一秒,今天,我们来聊聊一款... 目录一、软件概述:二、功能亮点:1. 高考倒计时2. 添加目标倒计时3. 励志语句4. 透明度调节与

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的