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的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

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

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

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

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

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

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory