base10. ThreadLocalSingleton线程本地单例模板类

2024-03-10 21:58

本文主要是介绍base10. ThreadLocalSingleton线程本地单例模板类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ThreadLocalSingleton类图

在这里插入图片描述
数据成员:

static _thread T* t_value:一个类型是T的线程本地指针t_value,该指针是POD类型,故线程本地存储可以用__thread关键字
static Deleter deleter
:一个类型是Deleter的deleter_对象,deleter_对象主要是为了能够调用destructor使得t_value_可以被自动释放

成员函数:

static T& instance():返回单例对象t_value_的引用,调用deleter_.set()使得t_value_可以被自动销毁,因为每个线程都有一个指针,因此不需要额外考虑线程安全
static T* pointer():返回单例对象t_value_的指针
static void destructor(void* obj):调用delete函数销毁单例对象t_value_

Deleter类图
在这里插入图片描述
数据成员:

pthread_key_t pkey_:一个指向线程特定数据的pthread_key_t类型的pkey_对象

成员函数:

Deleter():构造函数,调用pthread_key_create()创建pkey_,并注册销毁函数destructor()
~Deleter():析构函数,调用pthread_key_delete()销毁pkey_
void set(T* newObj):调用pthread_setspecific可以为t_value_设置线程特定绑定

ThreadLocalSingleton.h

//线程本地单例类封装ThreadLocalSingleton.h
#ifndef MUDUO_BASE_THREADLOCALSINGLETON_H
#define MUDUO_BASE_THREADLOCALSINGLETON_H#include <boost/noncopyable.hpp>
#include <assert.h>
#include <pthread.h>namespace muduo
{template<typename T>
class ThreadLocalSingleton : boost::noncopyable
{public://返回单例对象t_value_的引用,因为每个线程都有一个指针,因此不需要额外考虑线程安全static T& instance(){if (!t_value_){t_value_ = new T();//调用deleter_.set()使得t_value_可以被自动销毁deleter_.set(t_value_);}return *t_value_;}//返回单例对象t_value_的指针static T* pointer(){return t_value_;}private://调用delete函数销毁单例对象t_value_static void destructor(void* obj){assert(obj == t_value_);typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];delete t_value_;t_value_ = 0;}//嵌套类Deleter,该类目的是在t_value_对象销毁时自动回调destructor()函数class Deleter{public:Deleter(){pthread_key_create(&pkey_, &ThreadLocalSingleton::destructor);}~Deleter(){pthread_key_delete(pkey_);}void set(T* newObj){assert(pthread_getspecific(pkey_) == NULL);pthread_setspecific(pkey_, newObj);}pthread_key_t pkey_;};//一个类型是T的线程本地指针t_value_,该指针是POD类型,故线程本地存储可以用__thread关键字static __thread T* t_value_;//一个类型是Deleter的deleter_对象,deleter_对象主要是为了能够调用destructor使得t_value_可以被自动释放static Deleter deleter_;
};template<typename T>
__thread T* ThreadLocalSingleton<T>::t_value_ = 0;template<typename T>
typename ThreadLocalSingleton<T>::Deleter ThreadLocalSingleton<T>::deleter_;}
#endif

这篇关于base10. ThreadLocalSingleton线程本地单例模板类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5