スレッドセーフシングルトンシングルトンのデザインパターン

方法1:Linuxスレッドライブラリpthread_onceを使用して達成します。

noncopyable.h

#pragma once

struct noncopyable
{
protected:
    noncopyable() = default;
    ~noncopyable() = default;
    
private:
    noncopyable(const noncopyable&) = delete;
    noncopyable& operator=(const noncopyable&) = delete;
};
#pragma once

#include "noncopyable.h"
#include <pthread.h>

template<typename T>
struct Singleton : noncopyable
{
    static T& getInstace()
    {
        pthread_once(&poncet_, &Singleton::init);
        return *data_;
    }

private:
    static void init()
    {
        data_ = new T();
    }

private:
    static T* data_;
    static pthread_once_t poncet_;
};

template<typename T>
T* Singleton<T>::data_ = nullptr;

template<typename T>
pthread_once_t Singleton<T>::poncet_ = PTHREAD_ONCE_INIT;

方法2:内部静的ローカル変数を使用する

#pragma once

#include "noncopyable.h"

template<typename T>
struct Singleton : noncopyable
{
    static T& getInstace()
    {
        static T data_
        return data_;
    }

    // do somthing
};

使用する:

#include <iostream>
#include "Singleton.h"

using namespace std;

struct Test
{
    Test() {}

    void doIt()
    {
        cout << "test do it" << endl;
    }
};

int main(int argc, char* argv[])
{
    auto& test = Singleton<Test>::getInstace();

    test.doIt();
    
    return 0;
}

 

おすすめ

転載: blog.csdn.net/xunye_dream/article/details/114792877