tars源码漫谈第26篇------tc_monitor.h(与互斥锁、条件变量相关的重要类)

2024-02-06 11:08

本文主要是介绍tars源码漫谈第26篇------tc_monitor.h(与互斥锁、条件变量相关的重要类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      tc_monitor中的TC_Monitor是线程锁的监控类模板, 通常线程锁,都通过该类来使用,而不是直接用TC_ThreadMutex、TC_ThreadRecMutex 

      来看看源码:

/*** Tencent is pleased to support the open source community by making Tars available.** Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.** Licensed under the BSD 3-Clause License (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at** https://opensource.org/licenses/BSD-3-Clause** Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License.*/#ifndef _TC_MONITOR_H
#define _TC_MONITOR_H#include "util/tc_thread_mutex.h"
#include "util/tc_thread_cond.h"namespace tars
{
/
/** * @file tc_monitor.h * */           
/
/*** @brief 线程锁监控模板类.* 通常线程锁,都通过该类来使用,而不是直接用TC_ThreadMutex、TC_ThreadRecMutex *  * 该类将TC_ThreadMutex/TC_ThreadRecMutex 与TC_ThreadCond结合起来; */
template <class T, class P>
class TC_Monitor
{
public:/*** @brief 定义锁控制对象*/typedef TC_LockT<TC_Monitor<T, P> > Lock;typedef TC_TryLockT<TC_Monitor<T, P> > TryLock;/*** @brief 构造函数*/TC_Monitor() : _nnotify(0){}/*** @brief 析够*/virtual ~TC_Monitor(){}/*** @brief 锁*/void lock() const{_mutex.lock();_nnotify = 0;}/*** @brief 解锁, 根据上锁的次数通知*/void unlock() const{notifyImpl(_nnotify);_mutex.unlock();}/*** @brief 尝试锁.** @return bool*/bool tryLock() const{bool result = _mutex.tryLock();if(result){_nnotify = 0;}return result;}/*** @brief 等待,当前调用线程在锁上等待,直到事件通知,*/void wait() const{notifyImpl(_nnotify);try{_cond.wait(_mutex);}catch(...){_nnotify = 0;throw;}_nnotify = 0;}/*** @brief 等待时间,当前调用线程在锁上等待,直到超时或有事件通知*  * @param millsecond 等待时间* @return           false:超时了, ture:有事件来了*/bool timedWait(int millsecond) const{notifyImpl(_nnotify);bool rc;try{rc = _cond.timedWait(_mutex, millsecond);}catch(...){_nnotify = 0;throw;}_nnotify = 0;return rc;}/*** @brief 通知某一个线程醒来 *  * 通知等待在该锁上某一个线程醒过来 ,调用该函数之前必须加锁, *  * 在解锁的时候才真正通知 */void notify(){if(_nnotify != -1){++_nnotify;}}/*** @brief 通知等待在该锁上的所有线程醒过来,* 注意调用该函数时必须已经获得锁.*  * 该函数调用前之必须加锁, 在解锁的时候才真正通知 */void notifyAll(){_nnotify = -1;}protected:/*** @brief 通知实现. *  * @param nnotify 上锁的次数*/void notifyImpl(int nnotify) const{if(nnotify != 0){if(nnotify == -1){_cond.broadcast();return;}else{while(nnotify > 0){_cond.signal();--nnotify;}}}}private:/** * @brief noncopyable*/TC_Monitor(const TC_Monitor&);void operator=(const TC_Monitor&);protected:/*** 上锁的次数*/mutable int     _nnotify;mutable P       _cond;T               _mutex;
};/*** 普通线程锁*/
typedef TC_Monitor<TC_ThreadMutex, TC_ThreadCond> TC_ThreadLock;/*** 循环锁(一个线程可以加多次锁)*/
typedef TC_Monitor<TC_ThreadRecMutex, TC_ThreadCond> TC_ThreadRecLock;}
#endif

      其中有:

typedef TC_Monitor<TC_ThreadMutex, TC_ThreadCond> TC_ThreadLock;

      TC_ThreadLock是非常重要的, 在tars源码中,  广泛使用。 兼具了互斥锁和条件变量的管理/监控功能, 如:

protected:/*** 上锁的次数*/mutable int     _nnotify;mutable P       _cond;T               _mutex;

       

      而TC_ThreadRecLock也类似。

 

 

 

 

这篇关于tars源码漫谈第26篇------tc_monitor.h(与互斥锁、条件变量相关的重要类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python之变量命名规则详解

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

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

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 为

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

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

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