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

C++ 線程安全單例模式:Double-Checked Locking 實現

     編輯:C++ 入門

模板實現


#include <iostream>
#include <mutex>
using namespace std;

template <class T>
class Singleton {
public:
    static T* instance() {
        if (object == nullptr) {
            lock_guard<mutex> lock(mtx);
            if (object == nullptr) object = new T;
        }
        return object;
    }
private:
    Singleton() = default;
    static T* object;
    static mutex mtx;
};

template <class T> T* Singleton<T>::object = nullptr;
template <class T> mutex Singleton<T>::mtx;

class Foo { };
int main() {
    Foo* f = Singleton<Foo>::instance();
    return 0;
}

關鍵點

  • 雙重檢查鎖定:先無鎖判斷,再加鎖二次判斷,減少鎖開銷。
  • 使用 std::mutex 和 lock_guard 保證線程安全(C++11)。
  • 構造函數私有,防止外部實例化。
  • 靜態成員需類外定義初始化。

現代 C++ 改進

C++11 起推薦用 static local variable(Magic Static),編譯器保證線程安全且無鎖:
static T& instance() { static T obj; return obj; }

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