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

帅比萌擦擦* 提交于 2019-12-08 06:42:58

问题


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

回答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.



来源:https://stackoverflow.com/questions/32900047/can-some-one-confirm-if-this-is-a-thread-safe-implementation-of-singleton

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!