我想在windows和cygwin(linux)上执行一些代码(c ++),发现单例类的执行是有区别的。 由于我的代码具有与其他单例类的依赖关系,它在linux上正常运行,而不是windows,有时反之亦然。
请看下面的序列:
Posix: Singleton : UniqueIdService Singleton : MonitorServer MonitorServer : Waiting for Monitor Client connection.... Singleton : ManagerServer ManagerServer : Waiting for Tester Client connection.... Singleton : EventAggregator Singleton : DataAggregator Singleton : CounterService Singleton : AppletManager Singleton : SubService Singleton : PubService main Windows: Singleton : AppletManager Singleton : PubService Singleton : SubService Singleton : CounterService Singleton : DataAggregator Singleton : EventAggregator Singleton : ManagerServer ManagerServer : Waiting for Tester Client connection.... Singleton : MonitorServer MonitorServer : Waiting for Monitor Client connection.... Singleton : UniqueIdService main
有没有一种方法或机制来跨平台sorting这些执行?
代码示例。 AppletManger.cpp:
AppletManager *AppletManager::instance = new AppletManager(); AppletManager::AppletManager(void) { printf("\n Singleton : AppletManager"); }
AppletManager.h
class AppletManager { public: static AppletManager *getInstance(){ assert(instance != NULL); return instance; } ~AppletManager(); private: AppletManager(); static AppletManager *instance; };
UniqueIdService.cpp:
UniqueIdService *UniqueIdService::instance = new UniqueIdService(); UniqueIdService::UniqueIdService() { printf("\n Singleton : UniqueIdService"); uniqueId = 0; appletId = 0; funcblocId = 0; eventId = 0; }
UniqueIdService.h:
class UniqueIdService { public: static UniqueIdService *getInstance(){ assert(instance != NULL); return instance; } ~UniqueIdService(); private: UniqueIdService(); static UniqueIdService *instance; };
在C ++中做单例的最好方法是:
A& getInstanceA() { static A a; return a; }
这是线程安全的,没有初始化问题的顺序。
您可以通过在另一个B
的构造函数中引用一个单例A
来创建初始化的部分顺序。 被引用的单例A
必须在引用单例B
的构造函数完成之前被构造,从而确保A
在B
之前被构造的顺序关系。
依赖关系图必须是非循环的,否则,你会得到一个单身。 不要那样做; 最好你会得到一个堆栈溢出。