单例和新运算符-线程安全

我知道 Scott Meyers Singleton 对于 C++11 及更高版本是线程安全的。以下代码是否也是线程安全的(对于 C++11 及更高版本)?

class T
{
    static T* obj;
public:
    T& GetInstance()
    {
        if (!obj)
        {
            obj = new T();
        }
        return *obj;
    }
};
T* T::obj=nullptr;

回答

不,此代码不是线程安全的。两个或多个不同的线程可以同时调用GetInstance,并且由于obj没有同步(互斥、原子变量)来保护它,因此您会发生数据竞争。数据竞争意味着您的代码具有不安全的未定义行为。


以上是单例和新运算符-线程安全的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>