ACE中的单例

ACE中有两种单例

ACE_SingletonACE_Unmanaged_Singleton

(1)ACE_Singleton会向ACE_Object_Manager登记该单体实例,ACE_Object_Manager承担了在程序终止时销毁单体实例的任务;

(2)ACE_Unmanaged_Singleton并不向ACE_Object_Manager登记实例,销毁单体需要显示的调用ACE_Unmanaged_Singleton::close(),一般在DLL种定义单体时采用ACE_Unmanaged_singleton. 

例如:

typedef ACE_Unmanaged_Singleton< Connector,ACE_Recursive_Thread_Mutex> CONNECTOR; 

定义了一个用于在dll中使用的单体,单一引用了一个Connector的对象,这个单例使用了线程递归互斥体ACE_Recursive_Thread_Mutex,这种互斥体通常用在需要回调驱动的C++框架中。比如Proactor框架。这个单体应该在dll被卸载的时候比如fini方法的end_event_loop()之前调用CONNECTOR::close();

 对于多个dll中共同使用的全局单例

则不应该使用ACE_Unmanaged_Singleton,而应该使用ACE_Singleton ,而此时由于ACE_Singleton是模板,模板在具现化时往往被多个dll调用的时候会实例化多个副本,所以此时的单例应该用C函数返回,从而保证唯一性。参考:跨动态链接库(dll)的单例模式(singleton)问题,以及多个DLL之间的Static变量以及模板实例化

具体实现

头文件:MessageQueue.h

#ifndef MESSAGEQUEUE_H
#define MESSAGEQUEUE_H

#include "ace/Message_Queue.h"
#include "ace/Synch.h"
#include <string>
#include "ace/Singleton.h"

#include "SCP_Export.h"

class SCP_Export RecordMessageQueue
{
public:
    RecordMessageQueue();

    size_t count_message(void);

    bool is_empty();

    int enqueue_message(const char* pData,  int len);

    int dequeue_message(char* pData,  int * len);

private:
    ACE_Message_Queue<ACE_MT_SYNCH> m_record_message_queue;
};


class SCP_Export PackageMessageQueue
{
public:
    PackageMessageQueue();

    size_t count_message(void);

    bool is_empty();

    int enqueue_message(const char* pData,  int len);
    
    int dequeue_message(char* pData,  int * len);

private:
    ACE_Message_Queue<ACE_MT_SYNCH> m_package_message_queue;
};


extern "C" SCP_Export PackageMessageQueue* get_package_queue(void);

extern "C" SCP_Export RecordMessageQueue* get_record_queue(void);

#endif

源文件:MessageQueue.cpp

extern "C" PackageMessageQueue* get_package_queue(void)
{
    return ACE_Singleton<PackageMessageQueue,ACE_RW_Thread_Mutex>::instance();
}



 


本文参考:

http://andylin02.iteye.com/blog/431793


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值