首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

可繼承的 C++ Singleton 基類實現:線程安全、自動釋放

     編輯:關於C語言
 

單例模式回顧

確保系統中最多僅存在一個實例,由類別自行創建、持有、管理實例,控制實例數量。

典型單例寫法 (Singleton.h)

#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <memory>
#include <boost/thread/mutex.hpp>

class Singleton {
public:
    static Singleton& GetInstance();
private:
    Singleton(); ~Singleton();
    static std::auto_ptr<Singleton> s_instance;
    friend class std::auto_ptr<Singleton>;
    Singleton(const Singleton&); Singleton& operator=(const Singleton&);
};
#endif

實作細節 (Singleton.cpp)

#include "Singleton.h"
#include <boost/thread/mutex.hpp>
#include <iostream>
using namespace std; using namespace boost;

auto_ptr<Singleton> Singleton::s_instance;

Singleton::Singleton() { cout << "Construct Singleton" << endl; }
Singleton::~Singleton() { cout << "Destruct Singleton" << endl; }

Singleton& Singleton::GetInstance() {
    static mutex s_mutex;
    if (s_instance.get() == NULL) {
        mutex::scoped_lock lock(s_mutex);
        if (s_instance.get() == NULL) {
            s_instance.reset(new Singleton());
        }
    }
    return *s_instance;
}
  • 雙重檢查鎖定 (DCLP) + auto_ptr 確保線程安全與程式結束自動釋放。
  • 私有建構子/複製建構子/指派運算子防止外部實例化。

痛點:大量單例類別重複造輪子

若系統有大量單例,每個都寫一遍極其繁瑣。欲提取可繼承基類,但 static s_instance 若定義在基類,所有子類共享同一指標,無法各自持有實例。

解決方向 (未完待續)

需讓每個子類擁有獨立的靜態實例指標。可利用 CRTP (Curiously Recurring Template Pattern) 或模板特化實現,使基類模板參數為子類型別,從而產生各自的靜態成員。後續將給出完整可繼承單例基類代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved