我试图在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
是否有一种方法或机制可以跨平台对这些执行进行排序?
代码示例。 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;
};
答案 0 :(得分:0)
在C ++中执行单例的最佳方法是:
A& getInstanceA() {
static A a;
return a;
}
这是线程安全的,没有初始化问题的顺序。
答案 1 :(得分:0)
只需在另一个A
的构造函数中引用一个单例B
,就可以创建初始化的部分排序。引用单例A
必须在引用单例B
的构造函数完成之前构造,从而确保在A
之前构造B
的排序关系。
依赖图必须是非循环的,否则你会一直让单身人士失望。不要这样做;充其量只会导致堆栈溢出。