微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决单例和新运算符 - 线程安全

我知道 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 没有同步(互斥,原子变量)来保护它,所以你有一个数据竞争。数据竞争意味着您的代码具有不安全的未定义行为。

,

不是线程安全的:

同时调用 GetInstance 的两个线程都可以进入 if 块并分配两次。

返回的对象也可能不匹配。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。