c++ - C++ Singleton类类型类

  显示原文与译文双语对照的内容

我在多线程环境中做了很少的工作。 因此,我需要知道类函数的getInstance下面是否是线程安全的。 这是单独的类:


//Singleton class


class S {


//intentionally avoided pointer


 static S singleObject;



//Private constructor 


 s ();


 s (S &);


 s& operator= (const s&);


public:


//return reference of static object


 s& getInstance ()


 {


 return singleObject;


 }



/* Normally with static pointer instance, getInstnace look like as


 s& getInstace ()


 {


//trying to avoid multiple copies of singleObject


 lock_mutex ()



 if (singleObject == null)


 singleObjecct = new S();



 unlock_mutex ();



 return *singleObject;


 }


 */


};



S S::singleObject;



在getInstance函数( 未注释) 中,返回对象的static 引用。 是否需要线程安全机制?

在第二个 getInstance ( 批注) 中,如果singleObject为空,则创建对象。 所以它需要一个锁定机制并且需要同步?

时间: 原作者:

在getInstance函数( 未注释) 中,返回对象的static 引用。 是否需要线程安全机制?

只要不在 main 函数的生存期内访问它,或者在它的他线程可以能有unsynchronised访问时修改它。

如果在 main 开始之前或者结束之后进行访问( 比如 。 从另一个 static 对象的构造函数或者析构函数中,它不会被初始化,或者已经被破坏。 这就是"惰性初始化"的动机,比如你的第二版。

在第二个 getInstance ( 批注) 中,如果singleObject为空,则创建对象。 所以它需要一个锁定机制并且需要同步?

是,需要锁定机制。 对于支持 C++11 ( 或者类似的) 线程模型的编译器,使用函数静态变量的简单方法是使用函数静态变量:


S& getInstance ()


{


 static S singleObject;


 return singleObject;


}



这也避免了版本的内存泄漏,但是引入了它的他 static 对象之前的危险,因这里不安全访问 static 析构函数。

通常,C++ 中的static 对象是这样的deathtraps ( 你是否试图用某种单一的反模式来包装它们) 库,最好避免。

原作者:
...