ACE中的单例
来源:互联网 发布:js调用api截屏 qt 编辑:程序博客网 时间:2024/05/22 15:19
ACE中有两种单例
ACE_Singleton 和ACE_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
- ACE中的单例
- ACE中的inline
- ACE中的Share MEM
- ACE中的设计模式
- ACE中的一些陷阱
- ACE中的栅栏(Barrier)
- ACE中的精确定时器
- ACE中的进程
- ACE中的TCP通讯
- ACE中的UDP通讯
- ACE例
- OC中的单例
- OC中的单例
- OC中的单例
- iOS中的单例
- iOS中的单例
- iOS中的单例
- iOS中的单例
- 解决JFreeChart无法正常显示中文问题
- 数据结构之线性队列
- Linux下Mysql的rpm的安装
- 虚函数 虚继承 sizeof
- 使用 Intel HAXM 为 Android 模拟器加速
- ACE中的单例
- 如何在YouTube下载视频
- 【转】Android面试笔试集锦
- 永洪科技BI产品体验记
- Java中的timer类
- 桌面窗口知识
- 永别了我永远怀念的Windows XP
- 终于看完了,纪念下
- Hybrid App和phonegap