singleton 单例程模式
实际运用:
在不同编译实例中存在non-local static 对象,对象的实例化顺序无法确定
class FileSystem { public: }; extern FileSystem tfs; class Directory { public: Directory(params); }; Directory(params) { disks=tfs.numdisks(); } Directory tempDir(params);
两个对象tfs和tempDir无法确认初始化顺序,有可能会导致错误
解决办法采用单例程模式:使用local-static替换non-local static ,具体使用办法,在一个函数中声明对象类型为static,并且返回引用指向这个对象,在另一个编译单元中,对象不再直接使用这个对象而是调用生成对象的函数。
class FileSystem { public: }; extern FileSystem tfs; FileSystem& tfs()//函数替代non-local static对象 { static FileSystem ts; return ts; } ------------------------------------------------------------------------- class Directory { public: Directory(params); }; Directory(params) { disks=tfs().numdisks(); } Directory& tempDir() //函数替代non-local static { static Directory td; return td; }
此种local static对象的存在在多线程环境中都会遇到问题,解决的一种办法是在单线程启动环境中,手工调用所有reference—return函数,可以消除与初始化有关的“race conditions”(因为多线程环境下,不能确认那个线程先执行,可能产生“等待某事发生”这种情况产生)
浙公网安备 33010602011771号