#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++11 起推薦用 static local variable(Magic Static),編譯器保證線程安全且無鎖:
static T& instance() { static T obj; return obj; }