单例执行顺序

我想在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的构造函数完成之前被构造,从而确保AB之前被构造的顺序关系。

依赖关系图必须是非循环的,否则,你会得到一个单身。 不要那样做; 最好你会得到一个堆栈溢出。