#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;
}
Comments