#include <iostream>

#include <mutex>

#include <atomic>


class Singleton{

private:

Singleton(){}

Singleton(const Singleton &){}

Singleton & operator = (const Singleton &){}

static std::atomic<Singleton *> m_instance;

static std::mutex m_mutex;

public:

static Singleton * get_instance();

void show(){

printf("test\n");

}

};


std::atomic<Singleton *> Singleton::m_instance;

std::mutex Singleton::m_mutex;


Singleton * Singleton::get_instance(){

Singleton * tmp = m_instance.load(std::memory_order_relaxed); // 返回m_instance对应的指针,用于屏蔽编译器reorder优化 

std::atomic_thread_fence(std::memory_order_acquire); // 获得内存fence, 屏蔽编译器的reorder优化 

if(tmp == nullptr){

std::lock_guard<std::mutex> lock(m_mutex);

if(tmp == nullptr){

tmp = new Singleton;

std::atomic_thread_fence(std::memory_order_release); // 释放内存fence

m_instance.store(tmp, std::memory_order_relaxed); // 把tmp存进m_instance  

}

return tmp;

}


int main(){

Singleton * obj = Singleton::get_instance();

obj->show();

return 0;

}