brpc之单例

简介

GetLeakySingleton是单例模板类,线程安全的

GetLeakySingleton

cpp 复制代码
template <typename T> class GetLeakySingleton {
public:
    static butil::subtle::AtomicWord g_leaky_singleton_untyped;
    static pthread_once_t g_create_leaky_singleton_once;
    static void create_leaky_singleton();
};

包含三个静态成员

g_leaky_singleton_untyped:存放分配后的地址

g_create_leaky_singleton_once:创建时保证只调用一次

create_leaky_singleton:创建实例的方法

初始化

cpp 复制代码
template <typename T>
butil::subtle::AtomicWord GetLeakySingleton<T>::g_leaky_singleton_untyped = 0;

template <typename T>
pthread_once_t GetLeakySingleton<T>::g_create_leaky_singleton_once = PTHREAD_ONCE_INIT;

创建单例

cpp 复制代码
template <typename T>
void GetLeakySingleton<T>::create_leaky_singleton() {
    T* obj = new T;
    butil::subtle::Release_Store(
        &g_leaky_singleton_untyped,
        reinterpret_cast<butil::subtle::AtomicWord>(obj));
}

创建单例的模板方法

cpp 复制代码
template <typename T>
inline T* get_leaky_singleton() {
    const butil::subtle::AtomicWord value = butil::subtle::Acquire_Load(
        &GetLeakySingleton<T>::g_leaky_singleton_untyped);
    if (value) {
        return reinterpret_cast<T*>(value);
    }
    pthread_once(&GetLeakySingleton<T>::g_create_leaky_singleton_once,
                 GetLeakySingleton<T>::create_leaky_singleton);
    return reinterpret_cast<T*>(
        GetLeakySingleton<T>::g_leaky_singleton_untyped);
}
相关推荐
阿贵---7 分钟前
C++与物联网开发
开发语言·c++·算法
bcbobo21cn12 分钟前
C#引用类型学习
开发语言·c#·值类型·引用类型
荪荪14 分钟前
“快速入门ROS2与C++”的实战计划
java·开发语言·c++
qq_3349031515 分钟前
实时数据压缩库
开发语言·c++·算法
薛不痒18 分钟前
大模型agent
java·开发语言
计算机安禾19 分钟前
【数据结构与算法】第1篇:为什么要学习数据结构与算法?专栏导学
c语言·开发语言·c++·学习·算法·visual studio code·visual studio
言之。19 分钟前
时间轮(Time Wheel)数据结构入门指南
开发语言·数据结构·python
左左右右左右摇晃20 分钟前
Java并发——CAS(比较并替换)
java·开发语言·jvm
Yang-Never25 分钟前
AI Code -> Windows电脑安装Claude
开发语言·windows·git
天下无敌笨笨熊31 分钟前
C#异步开发探微
开发语言·c#