ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

brpc之单例

2026/9/20 21:05:24 拓冰建站 浏览量
brpc之单例

简介

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

GetLeakySingleton

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:创建实例的方法

初始化

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;

创建单例

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));
}

创建单例的模板方法

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);
}