C++当中常常需要一个全局唯一的对象实例,这时候,我们就会想到单件模式。如何实现这一模式?全局变量当然是一个简单可行的方法,然而,这太丑陋。嗯,其实,丑陋倒也罢了,最严重的是它将引诱程序员滥用全局变量,这将导致维护的灾难。
既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很好,而且足够简单。不过,天空中尚有一朵小小的乌云,让我们来看一看它是什么。
静态成员变量的初始化,和全局对象一样,实际上实在main函数进入后,我们写下的一行代码之前被执行的。而且,我们知道那个著名的初始化顺序是不可靠的问题(跨编译单元)。当我的全局对象是一个复杂对象――这很常见,比如一个环境管理器――它甚至还需要复杂的装配过程,我们需要考虑:构建这个单件的时候,其对象都准备好了吗?如果我们不能确定,那么一个常见的措施是延迟单件对象的构造――把它延迟到全局对象初始化结束以后怎么样?这好像很容易实现:
SomeClass * SomeClass ::instance(){
static SomeClass inst;
return &inst;
}
多线程中局部静态变量初始化的陷阱
最新推荐文章于 2022-10-16 16:56:26 发布
本文讨论了在多线程环境中使用静态局部变量实现单例模式时可能遇到的初始化和析构顺序问题,以及由此可能导致的重复初始化风险。作者指出,静态变量的初始化不是一个原子操作,需要通过互斥锁等机制确保线程安全。同时,文章通过代码示例揭示了一种错误的实现方式,并推荐使用Loki::SingletonHolder作为更可靠的单例实现选项。
摘要由CSDN通过智能技术生成