tars源码漫谈第24篇------tc_lock.h(基本锁)

2024-02-06 11:08

本文主要是介绍tars源码漫谈第24篇------tc_lock.h(基本锁),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      这个文件很简单, 来看下:

/*** 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_LOCK_H
#define _TC_LOCK_H#include <string>
#include <stdexcept>
#include <cerrno>
#include "util/tc_ex.h"using namespace std;namespace tars
{
/
/*** @file tc_lock.h * @brief  锁类 */           
//**
* @brief  锁异常
*/
struct TC_Lock_Exception : public TC_Exception
{TC_Lock_Exception(const string &buffer) : TC_Exception(buffer){};TC_Lock_Exception(const string &buffer, int err) : TC_Exception(buffer, err){};~TC_Lock_Exception() throw() {};
};/*** @brief  锁模板类其他具体锁配合使用,* 构造时候加锁,析够的时候解锁*/
template <typename T>
class TC_LockT
{
public:/*** @brief  构造函数,构造时枷锁*  * @param mutex 锁对象*/TC_LockT(const T& mutex) : _mutex(mutex){_mutex.lock();_acquired = true;}/*** @brief  析构,析构时解锁*/virtual ~TC_LockT(){if (_acquired){_mutex.unlock();}}/*** @brief  上锁, 如果已经上锁,则抛出异常*/void acquire() const{if (_acquired){throw TC_Lock_Exception("thread has locked!");}_mutex.lock();_acquired = true;}/*** @brief  尝试上锁.** @return  成功返回true,否则返回false*/bool tryAcquire() const{_acquired = _mutex.tryLock();return _acquired;}/*** @brief  释放锁, 如果没有上过锁, 则抛出异常*/void release() const{if (!_acquired){throw TC_Lock_Exception("thread hasn't been locked!");}_mutex.unlock();_acquired = false;}/*** @brief  是否已经上锁.** @return  返回true已经上锁,否则返回false*/bool acquired() const{return _acquired;}protected:/*** @brief 构造函数* 用于锁尝试操作,与TC_LockT相似*  */TC_LockT(const T& mutex, bool) : _mutex(mutex){_acquired = _mutex.tryLock();}private:// Not implemented; prevents accidental use.TC_LockT(const TC_LockT&);TC_LockT& operator=(const TC_LockT&);protected:/*** 锁对象*/const T&        _mutex;/*** 是否已经上锁*/mutable bool _acquired;
};/*** @brief  尝试上锁*/
template <typename T>
class TC_TryLockT : public TC_LockT<T>
{
public:TC_TryLockT(const T& mutex) : TC_LockT<T>(mutex, true){}
};/*** @brief  空锁, 不做任何锁动作*/
class TC_EmptyMutex
{
public:/*** @brief  写锁.*  * @return int, 0 正确*/int lock()  const   {return 0;}/*** @brief  解写锁*/int unlock() const  {return 0;}/*** @brief  尝试解锁. *  * @return int, 0 正确*/bool trylock() const {return true;}
};/*** @brief  读写锁读锁模板类* 构造时候加锁,析够的时候解锁*/template <typename T>
class TC_RW_RLockT
{
public:/*** @brief  构造函数,构造时枷锁** @param lock 锁对象*/TC_RW_RLockT(T& lock): _rwLock(lock),_acquired(false){_rwLock.ReadLock();_acquired = true;}/*** @brief 析构时解锁*/~TC_RW_RLockT(){if (_acquired){_rwLock.Unlock();}}
private:/***锁对象*/const T& _rwLock;/*** 是否已经上锁*/mutable bool _acquired;TC_RW_RLockT(const TC_RW_RLockT&);TC_RW_RLockT& operator=(const TC_RW_RLockT&);
};template <typename T>
class TC_RW_WLockT
{
public:/*** @brief  构造函数,构造时枷锁** @param lock 锁对象*/TC_RW_WLockT(T& lock): _rwLock(lock),_acquired(false){_rwLock.WriteLock();_acquired = true;}/*** @brief 析构时解锁*/~TC_RW_WLockT(){if(_acquired){_rwLock.Unlock();}}
private:/***锁对象*/const T& _rwLock;/*** 是否已经上锁*/mutable bool _acquired;TC_RW_WLockT(const TC_RW_WLockT&);TC_RW_WLockT& operator=(const TC_RW_WLockT&);
};};
#endif

      针对锁和基本操作,定义了类模板, 仅此而已。 

      这种代码, 我是很欣赏的:

private:// Not implemented; prevents accidental use.TC_LockT(const TC_LockT&);TC_LockT& operator=(const TC_LockT&);

       不多说。

 

 

 

 

这篇关于tars源码漫谈第24篇------tc_lock.h(基本锁)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁