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 會以與登記次序相反的次序銷燬所有登記的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章