免责声明:我来自 Java 背景,因此,我不知道 C++(和相关库)的许多内部结构是如何工作的。
我已经阅读了足够多的内容,知道双重检查锁定是邪恶的,单例模式的正确和安全实现需要适当的工具。
我相信以下代码可能不安全,受编译器重新排序和未初始化对象分配的影响,但我不确定我是否遗漏了一些我不了解该语言的内容。
typedef boost::shared_ptr<A> APtr;
APtr g_a;
boost::mutex g_a_mutex;
const APtr& A::instance()
{
if (!g_a)
{
boost::mutex::scoped_lock lock(g_a_mutex);
if (!g_a)
{
g_a = boost::make_shared<A>();
}
}
return g_a;
}
我相信实际代码是在 C++03 下编译的。
这个实现不安全吗?如果是这样,怎么做?