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

相关文章

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

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

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

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

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

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

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

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

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