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

相关文章

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

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

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

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

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

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字