【QT】C++线程安全的单例模板

打印 上一主题 下一主题

主题 775|帖子 775|积分 2325

模板代码

  1. #pragma once
  2. #include <mutex>
  3. #include <atomic>
  4. // CRTP基类模板 Curiously Recurring Template Parttern—奇异递归模板模式。
  5. template <typename T>
  6. class SingletonCRTP {
  7. public:
  8.         // 禁止拷贝构造和赋值操作
  9.         SingletonCRTP(const SingletonCRTP&) = delete;
  10.         SingletonCRTP& operator=(const SingletonCRTP&) = delete;
  11.         // 禁止移动构造和赋值操作
  12.         SingletonCRTP(SingletonCRTP&&) = delete;
  13.         SingletonCRTP& operator=(SingletonCRTP&&) = delete;
  14.         // 获取单例实例
  15.         static T* getInstance() {
  16.                 if (m_instance == nullptr) {
  17.                         std::unique_lock<std::mutex> lock(m_Mutex); // 加锁
  18.                         if (m_instance == nullptr) {
  19.                                 T* temp = new (std::nothrow) T();
  20.                                 if (temp == nullptr) {
  21.                                         throw std::bad_alloc();
  22.                                 }
  23.                                 m_instance = temp;
  24.                         }
  25.                 }
  26.                 return m_instance;
  27.         }
  28. protected:
  29.         SingletonCRTP() = default;
  30.         ~SingletonCRTP() {
  31.                 if (m_instance) {
  32.                         delete m_instance;
  33.                         m_instance = nullptr;
  34.                 }
  35.         }
  36.         // 静态成员变量定义
  37.         static T* m_instance;
  38.         static std::mutex m_Mutex;
  39. };
  40. // 静态成员变量的模板类特化
  41. template <typename T>
  42. T* SingletonCRTP<T>::m_instance = nullptr;
  43. template <typename T>
  44. std::mutex SingletonCRTP<T>::m_Mutex;
复制代码
使用方式

  1. #include "SingletonCRTP.h"
  2. class Class1 : public SingletonCRTP<Class1>
  3. {
  4.     friend class SingletonCRTP<Class1>;
  5. public:
  6.     void DoDoDo() {
  7.         printf("Hello World!");
  8.     }
  9. }
  10. int main(int argc, char *argv[])
  11. {
  12.         Class1::getInstance()->DoDoDo();
  13. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表