找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6134|回复: 2

也谈ACE_Singleton

[复制链接]
发表于 2008-7-15 23:36:46 | 显示全部楼层 |阅读模式
在使用ACE_Singleton时遇到一个很困惑的问题:
我在SessionPool.dll中的SessionPool.hSessionPool.cpp中定义了一个类SessionPool,并在SessionPool.h中定义如下语句:
typedef ACE_Singleton<SessionPool,ACE_Null_Mutex> SESSION_POOL;
SessionPool.dll编译没问题。

我的EXE使用B.dllC.dll,而这两个dll都要访问在SessionPool.dll中定义的单体对象。然而不幸的是,我发现B.dllC.dll为我分别创建了2ACE_Singleton!!!分析原因,大概是模板类实例化的问题吧。

这样的话,我在B.dll中为单体对象添加数据后,就无法在C.dll代码中继续处理。


解决方案一SessionPool建立成单体。

SessionPool* &SessionPool::instance_i()
{
       static  SessionPool* _instance = 0;

       return _instance;
}

SessionPool* SessionPool::Instance()
{
       SessionPool* &_instance = SessionPool::instance_i();

       if(0 == _instance){
              _instance = new SessionPool();
       }
    return _instance;
}

void SessionPool::Close()
{
       SessionPool* &_instance = SessionPool::instance_i();

       delete _instance;
       _instance = 0;
}

然后在各处调用SessionPool::Instance()就行了。但这种方法明显的问题是必须显式关闭,不如ACE_Singleton方便;还有无法使用ACE_Singleton的锁同步机制。


解决方案2SessionPool.h中建立类SESSION_POOL并输出:
class SP_Export SESSION_POOL : public ACE_Singleton<SessionPool,ACE_Null_Mutex>   
{
};
而不用typedef,一切解决啦。试了半天才想起来试一下:(  


后来一想,这个问题倒可以在不同dll中实现“局部”的ACE_Singleton。不过和编译器能力有关,有点危险。
 楼主| 发表于 2008-7-15 23:36:59 | 显示全部楼层
DLL中,是推荐用ACE_Unmanaged_Singleton的。
发表于 2010-9-10 21:18:57 | 显示全部楼层
路过此地,学习学习
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 21:06 , Processed in 0.014375 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表