忙了将近一年的2个项目终于在末日来临前结束了,一直都在忙,忘了积累曾经遇到过解决过的问题,翻开收藏夹,好多好多,让人看完不知道该怎么下手,也意识到必须来更新博客了,同时领悟到在项目时候,一个文档,可以零星记录问题的始终,在结项的时候,利用几天偷闲的时光,整理整理,对于领悟与回味,甚好。
因为项目是从单一模式到多个模式,所以原来的Singleton类 ,变得有点复杂,它们之间突然多了某种构造依赖关系和析构依赖关系,虽然我们可以利用Meyers Singleton来控制构造顺序,却不能控制析构顺序。
引用摘录的一段:
Scott Meyer在<<Effective C++>>3rd Item4中提出了一个解决方案,当将non-local static变量移动到静态方法中成为local static变量的时候。C++保证当第一次静态方法被调用的时候,才会创建该静态变量。但是这里有一个疑问,创建顺序能够被控制了,可是析构顺序呢?我们只知道进程结束的时候,local static 变量会被析构,而且按照创建顺序的相反顺序进行。如果几个Singleton类的析构函数之间也有依赖关系,并且这种依赖顺序关系和LIFO顺序冲突,就会造成dead-reference问题。
一开始软件总在关闭的时候出现异常crash掉,仔细追踪之下,才发现是Singleton类的析构出了问题,dead-reference问题,终于意识到已经把基础掉了一地,同一些技术群友讨论得到如此心得,虽然我最后解决问题是去掉了Singleton的继承,因为对整个项目做了一次Singleton的瘦身活动,精简了一些没有必要,或者在多线程里面不确定的因素,统统cut掉继承Singleton,从单一模式改项目到多线程,多DLL环境,处理这些问题,真是呕心沥血。
C++全局静态变量的析构销毁顺序是未定义的,特别是在多线程环境,多dll环境下,特别复杂。
如果是单线程的话,建议用指针的方式,在AppInit的时候构造,在AppExit的时候delete,并设置为0。别的地方引用的时候先判断。
多线程的话,显然要加锁了,需要效率的话,原子锁