单例执行序列

时间:2015-12-15 21:25:52

标签: c++ windows cygwin singleton

我试图在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;
};

2 个答案:

答案 0 :(得分:0)

在C ++中执行单例的最佳方法是:

A& getInstanceA() {
    static A a;
    return a;
}

这是线程安全的,没有初始化问题的顺序。

答案 1 :(得分:0)

只需在另一个A的构造函数中引用一个单例B,就可以创建初始化的部分排序。引用单例A必须在引用单例B的构造函数完成之前构造,从而确保在A之前构造B的排序关系。

依赖图必须是非循环的,否则你会一直让单身人士失望。不要这样做;充其量只会导致堆栈溢出。