如图所示,它不是线程安全的。C++ 语言对线程保持沉默,因此您无法从该语言获得内在保证。您将不得不使用平台同步原语,例如 Win32 ::EnterCriticalSection(),来保护访问。
您的特定方法将是有问题的 b/c 编译器将插入一些(非线程安全)代码以instance
在第一次调用时初始化静态,很可能是在函数体开始执行之前(因此在可以调用任何同步之前)。 )
使用全局/静态成员指针SomeClass
,然后在同步块中初始化将证明实现起来的问题较小。
#include <boost/shared_ptr.hpp>
namespace
{
//Could be implemented as private member of SomeClass instead..
boost::shared_ptr<SomeClass> g_instance;
}
SomeBaseClass &SomeClass::GetInstance()
{
//Synchronize me e.g. ::EnterCriticalSection()
if(g_instance == NULL)
g_instance = boost::shared_ptr<SomeClass>(new SomeClass());
//Unsynchronize me e.g. :::LeaveCriticalSection();
return *g_instance;
}
我没有编译这个,所以它只是为了说明目的。它还依赖于 boost 库来获得与原始示例相同的生命周期(或大约相同的生命周期)。您还可以使用 std::tr1 (C++0x)。