Reputation: 9820
#include "iostream"
#include "atomic"
using namespace std;
class Singleton
{
Singleton();
static Singleton * _pInstance;
public:
~Singleton() {
}
static Singleton* getInstance() {
Singleton * tmp = _pInstance;
atomic_thread_fence(std::memory_order_acquire);
if (tmp == nullptr){
tmp = _pInstance;
if (!tmp) {
_pInstance = new Singleton();
atomic_thread_fence(std::memory_order_release);
_pInstance = tmp;
}
return _pInstance;
}
};
Singleton* Singleton::_pInstance = nullptr;
Upvotes: 1
Views: 105
Reputation: 1
Your implementation seems to be thread safe, but the simplest way to make a thread safe singleton looks like
class Singleton {
Singleton();
public:
~Singleton() {
}
static Singleton* getInstance() {
static Singleton theInstance;
return &theInstance;
}
};
or better return a reference
static Singleton& getInstance() {
static Singleton theInstance;
return theInstance;
}
You don't need to reinvent the wheel here.
Upvotes: 3