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

相关文章

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量,那么运行时会报uncaught ReferenceError: *** is not de

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

用Python编写倒计时程序:详细教程

目录 引言 环境准备 基本概念 代码实现 步骤一:导入必要的库 步骤二:获取用户输入 步骤三:实现倒计时逻辑 步骤四:整合代码 运行程序 高级功能 扩展功能示例:支持分钟和小时输入 扩展功能示例:图形用户界面 (GUI) 总结 引言 倒计时程序是一个非常常见的小工具,广泛用于各种应用场景中,例如考试时间提醒、烹饪计时器、会议倒计时等。Python 作为一种

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a = 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量,也可以直接手动写入函数(注意写入格式。) 这样点击按钮时就直接展示刚刚设置的全局变量3了。 2、更改变量值 在新建交互里点击设置变量值。 将a变量设置成等于10. 将新