问题描述
我知道 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
块并分配两次。
返回的对象也可能不匹配。