Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人能确认这是否是singleton的线程安全实现吗_C++_Thread Safety_Singleton - Fatal编程技术网

C++ 有人能确认这是否是singleton的线程安全实现吗

C++ 有人能确认这是否是singleton的线程安全实现吗,c++,thread-safety,singleton,C++,Thread Safety,Singleton,您的实现似乎是线程安全的,但是创建线程安全的单例的最简单方法如下 #include "iostream" #include "atomic" using namespace std; class Singleton { Singleton(); static Singleton * _pInstance; public: ~Singleton() { } static Singleton* getInstance()

您的实现似乎是线程安全的,但是创建线程安全的单例的最简单方法如下

#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;
或者最好返回一个参考

class Singleton {
    Singleton();

public:
    ~Singleton() {
    }

    static Singleton* getInstance() {
        static Singleton theInstance;
        return &theInstance;
    }
};

您不需要在这里重新发明轮子。

您能详细说明您的问题吗?我不知道这一点,但实现线程安全的单例是很简单的。最简单的单例,Meyers的单例,已经是线程安全的。双重检查锁模式的危险:我试图给代码添加注释,但我不知道如何解决这个问题:请添加一些上下文来解释代码部分,我添加了原子线程围栏,这样做好吗?@HocineDJEMAI:你能详细解释一下为什么要这样做而不是简单的线程安全实现吗。是研究吗?作业什么?
    static Singleton& getInstance() {
        static Singleton theInstance;
        return theInstance;
    }