多线程中局部静态变量初始化的陷阱

    C++当中常常需要一个全局唯一的对象实例,这时候,我们就会想到单件模式。如何实现这一模式?全局变量当然是一个简单可行的方法,然而,这太丑陋。嗯,其实,丑陋倒也罢了,最严重的是它将引诱程序员滥用全局变量,这将导致维护的灾难。

    既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很好,而且足够简单。不过,天空中尚有一朵小小的乌云,让我们来看一看它是什么。

    静态成员变量的初始化,和全局对象一样,实际上实在main函数进入后,我们写下的一行代码之前被执行的。而且,我们知道那个著名的初始化顺序是不可靠的问题(跨编译单元)。当我的全局对象是一个复杂对象――这很常见,比如一个环境管理器――它甚至还需要复杂的装配过程,我们需要考虑:构建这个单件的时候,其对象都准备好了吗?如果我们不能确定,那么一个常见的措施是延迟单件对象的构造――把它延迟到全局对象初始化结束以后怎么样?这好像很容易实现:
SomeClass * SomeClass ::instance(){
 static SomeClass inst;
 return &inst;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值