ACE 的初始化与关闭

mac2022-06-30  65

ACE 的初始化与关闭       一 ACE简介   ACE 是The ADAPTIVE Communication Environment 的简写。它是一个面向对象的、跨平台的、开放源码的网络编程基础设施框架。   ACE 是由Douglas C.Schmidt 博士主导开发的。学习ACE 可参考《C++ Network Programming》(两卷本)、《The ACE Programmer's Guide》。当然也可以阅读其相关文档 http://www.cs.wustl.edu/~schmidt/ACE.html(英文文档)。 http://www.acejoy.com/space/html/index.html(开发者论坛)。             二 ACE 初始化和关闭主要干了些什么?     我们一般使用ACE 开发都会使用到下面几行代码(VS2005开发环境):   

      #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

最新回复(0)