HDJEMAI
HDJEMAI

Reputation: 9820

can some one confirm if this is a thread safe implementation of singleton

#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

Answers (1)

πάντα ῥεῖ
πάντα ῥεῖ

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

Related Questions