懒汉式单例类

#include <iostream>#include <thread>#include <mutex>using namespace std;class Singleton{public:    static Singleton* getInstance();    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;private:    Singleton() = default;    static Singleton* instance;    static mutex mtx;};Singleton *Singleton::instance = nullptr;mutex Singleton::mtx;Singleton* Singleton::getInstance(){    if (instance == nullptr)    {        lock_guard<mutex> lck(mtx);     // 留神这里 !!!         if (instance == nullptr)        {            instance = new Singleton();        }    }    return instance;}void thread_func(){    Singleton* p = Singleton::getInstance();    // p-> do something ...}int main(){    thread th1(thread_func);    thread th2(thread_func);    th1.join();    th2.join();    return 0;}

饿汉式单例类

#include <iostream>#include <thread>using namespace std;class Singleton{public:    static Singleton* getInstance();    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;private:    Singleton() = default;    static Singleton* instance;};Singleton *Singleton::instance = new Singleton();   // 留神这里 !!!Singleton* Singleton::getInstance(){    return instance;}void thread_func(){    Singleton* p = Singleton::getInstance();    // p-> do something ...}int main(){    thread th1(thread_func);    thread th2(thread_func);    th1.join();    th2.join();    return 0;}

懒汉式的 call_once 实现

template <class Fn, class... Args>  void call_once (once_flag& flag, Fn&& fn, Args&&... args);
  • 精确执行一次可调用对象 fn ,即便同时从多个线程调用。
#include <iostream>#include <thread>#include <mutex>using namespace std;class Singleton{public:    static Singleton* getInstance();    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;private:    Singleton() = default;    static void createInstance();    static Singleton* instance;    static once_flag onceFlag;};void Singleton::createInstance(){    instance = new Singleton();}Singleton *Singleton::instance = nullptr;once_flag Singleton::onceFlag;Singleton* Singleton::getInstance(){    call_once(onceFlag, createInstance);  // 留神这里 !!!    return instance;}void thread_func(){    Singleton* p = Singleton::getInstance();    // p-> do something ...}int main(){    thread th1(thread_func);    thread th2(thread_func);    th1.join();    th2.join();    return 0;}

单例类的资源清理【饿、懒同理】

#include <iostream>#include <thread>#include <mutex>using namespace std;class Singleton{    struct Recycle    {        ~Recycle()       // 留神这里 !!!        {            if (instance != nullptr)            {                delete instance;                instance = nullptr;            }        }    };public:    static Singleton* getInstance();    Singleton(const Singleton&) = delete;    Singleton& operator=(const Singleton&) = delete;private:    Singleton() = default;    ~Singleton();    static Singleton* instance;    static mutex mtx;};Singleton *Singleton::instance = nullptr;mutex Singleton::mtx;Singleton* Singleton::getInstance(){    if (instance == nullptr)    {        lock_guard<mutex> lck(mtx);        if (instance == nullptr)        {            instance = new Singleton();            static Recycle recycle;        }    }    return instance;}Singleton::~Singleton()     // 留神这里 !!!{   // 单例类资源清理}void thread_func(){    Singleton* p = Singleton::getInstance();    // p-> do something ...}int main(){    thread th1(thread_func);    thread th2(thread_func);    th1.join();    th2.join();    return 0;}