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);
}
相关推荐
小禾苗_9 分钟前
C++ ——继承
开发语言·c++
李长渊哦11 分钟前
Java 虚拟机(JVM)方法区详解
java·开发语言·jvm
进击ing小白14 分钟前
Qt程序退出相关资源释放问题
开发语言·qt
烂蜻蜓1 小时前
前端已死?什么是前端
开发语言·前端·javascript·vue.js·uni-app
老猿讲编程1 小时前
安全C语言编码规范概述
c语言·开发语言·安全
Biomamba生信基地5 小时前
两天入门R语言,周末开讲
开发语言·r语言·生信
RAN_PAND5 小时前
STL介绍1:vector、pair、string、queue、map
开发语言·c++·算法
Bio Coder5 小时前
R语言安装生物信息数据库包
开发语言·数据库·r语言
Tiger Z5 小时前
R 语言科研绘图第 27 期 --- 密度图-分组
开发语言·程序人生·r语言·贴图