#include "stdafx.h" #include <ace/ACE.h> #include <ace/INET_Addr.h> #include <ace/SOCK_Connector.h> #include <ace/SOCK_Stream.h> #include <string> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { ACE::init();
/* ....... do something ...... */ ACE::fini(); return 0; }
ACE::init(); 作用是初始化ACE相关环境。ACE::fini(); 作用是关闭ACE。这两函数到底干了些什么呢?让我先看看ACE 源码是怎么写的吧! Init_ACE.h 文件时这么定义上面这两个函数的: #ifndef ACE_INIT_ACE_H #define ACE_INIT_ACE_H
#include /**/ "ace/pre.h"
#include /**/ "ace/ACE_export.h"
namespace ACE { extern ACE_Export int init (void); extern ACE_Export int fini (void); extern unsigned int init_fini_count_; }
#endif 在Init_ACE.cpp 文件中可以看到他们的实现
ACE::init (void) { // Don't use ACE_TRACE, because Object_Manager might not have been // instantiated yet. // ACE_TRACE ("ACE::init");
++ACE::init_fini_count_;
return ACE_Object_Manager::instance ()->init (); }
int ACE::fini (void) { ACE_TRACE ("ACE::fini");
if (ACE::init_fini_count_ > 0) { if (--ACE::init_fini_count_ == 0) return ACE_Object_Manager::instance ()->fini (); else // Wait for remaining fini () calls. return 1; } else // More ACE::fini () calls than ACE::init () calls. Bad // application! return -1; }
从上面的代码好像看不出来什么哦!但是我们还是有发现的,比如说:ACE_Object_Manager !这个类是干什么的呢?这正是我们要探讨的。
三 ACE_Object_Manager ACE_Object_Manager。顾名思义,这个类所作的事情是管理对象。ACE库含有这个类的单个实例,当ACE 实例化ACE对象时,这些对象都将在ACE_Object_Manager这里登记备案。登记时一般需要下面三个信息: void *object :对象执政。 ACE_CLEANUP_FUNC cleanup_hook:销毁对象的函数指针。 void *param:相关参数。 对象都被登记到一个 registered_objects_队列中。registered_objects_ 是ACE_OS_Exit_Info 的一个指针数据成员。上述这些工作均由ACE_OS_Exit_Info 类的at_exit_i 函数完成。
intACE_OS_Exit_Info::at_exit_i (void *object, ACE_CLEANUP_FUNC cleanup_hook, void *param) { ACE_Cleanup_Info new_info; new_info.object_ = object; new_info.cleanup_hook_ = cleanup_hook; new_info.param_ = param;
ACE_Cleanup_Info_Node *new_node = 0;
if ((new_node = registered_objects_->insert (new_info)) == 0) return -1; else { registered_objects_ = new_node; return 0; } }
其中ACE_CLEANUP_FUNC 的定义如下: typedef void (*ACE_CLEANUP_FUNC)(void *object, void *param)。 当你调用ACE::fini () 的时候,ACE_Object_Manager 会以与登记次序相反的次序销毁所有登记的对象。
转载于:https://www.cnblogs.com/zhangyunkui/archive/2009/09/18/1569494.html