方法一、使用once_flag call_once
#include <iostream>
#include <memory>
#include <mutex>
#include <thread>
class Singleton{
public:
static std::shared_ptr<Singleton> GetInstance();
~Singleton(){
std::cout << "deconstruct" <<std::endl;
}
private:
static std::shared_ptr<Singleton> instance;
Singleton(){
std::cout << "construct" <<std::endl;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
std::shared_ptr<Singleton> Singleton::instance = nullptr;
std::shared_ptr<Singleton> Singleton::GetInstance(){
if(!instance){
static std::once_flag flag;//注意flag是static
std::call_once(flag,
[&](){
std::cout <<"call_once" <<std::endl;
instance = std::shared_ptr<Singleton>(new Singleton());
} );//只调用一次
}
return instance;
}
int main()
{
std::shared_ptr<Singleton> instance1 = Singleton::GetInstance();
std::shared_ptr<Singleton> instance2 = Singleton::GetInstance();
std::cout <<"instance1:"<<instance1 <<" count:"<< instance1.use_count() << std::endl;
std::cout <<"instance1:"<<instance2 <<" count:"<< instance2.use_count() << std::endl;
return 0;
}
运行输出如下:
call_once
construct
instance1:0x56335f526280 count:3
instance1:0x56335f526280 count:3
deconstruct
方法二:使用静态变量
c++11之后使用静态变量也是线程安全的
#include <iostream>
#include <memory>
#include <mutex>
#include <thread>
class Singleton{
public:
static Singleton* GetInstance();
~Singleton(){
std::cout << "deconstruct" <<std::endl;
}
private:
Singleton(){
std::cout << "construct" <<std::endl;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
Singleton* Singleton::GetInstance(){
static Singleton instance;
return &instance;
}
int main()
{
Singleton* instance1 = Singleton::GetInstance();
Singleton* instance2 = Singleton::GetInstance();
std::cout <<"instance1:"<<instance1 << std::endl;
std::cout <<"instance1:"<<instance2 << std::endl;
return 0;
}
输出如下:
construct
instance1:0x5563fc0c2139
instance1:0x5563fc0c2139
deconstruct