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”(因为多线程环境下,不能确认那个线程先执行,可能产生“等待某事发生”这种情况产生)

posted on 2015-11-22 10:23  菜鸟基地  阅读(143)  评论(0)    收藏  举报

导航