歡迎您光臨本站 註冊首頁

使用 ACE 庫框架在 UNIX 中開發高性能併發應用

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
ACE 開放源碼工具包可以幫助開發人員創建健壯的可移植多線程應用程序。本文討論創建使用 ACE 線程的應用程序的一些方法。

Adaptive Communication Environment (ACE) 是一個高性能、開放源碼、面向對象的框架和 C++ 類庫,它有助於簡化網路應用程序的開發。ACE 工具包包括一個操作系統層和一個封裝網路 API 的 C++ 外觀(facades)集合。本文討論如何使用 ACE 線程設計高性能、併發、面向對象的網路應用程序。對 ACE 的完整說明,包括如何下載和安裝這個工具包,請參見 參考資料。

用於創建和管理線程的 ACE 類

在進程中生成和管理多個線程涉及下面的類:

  • ACE_Thread_Manager:這是負責創建、管理和同步線程的主要的類。每種操作系統在處理線程方面有細微差異,這個類對應用程序開發人員隱藏這些差異。
  • ACE_Sched_Params:使用這個類管理各個線程的調度優先順序,調度優先順序是在 ACE 源代碼發行版的 ace/Sched_Params.h 頭文件中定義的。可以採用不同的調度策略,可以是 “先到先服務” 的循環方式。
  • ACE_TSS:在多線程應用程序中使用全局變數會導致同步問題。ACE_TSS 類提供與線程相關的存儲模式,可以對那些對於程序是全局的,但是對於每個線程私有的數據提供抽象。ACE_TSS 類提供 operator() 方法,這個方法提供與線程相關的數據。




了解線程管理器類

原生操作系統線程 API 是不可移植的:存在語法和語義差異。例如,UNIX® pthread_create() 和 Windows® CreateThread() 方法都創建線程,但是語法不一樣。ACE_Thread_Manager 類提供以下功能:

  • 它可以生成一個或更多線程,每個線程運行自己指定的函數。
  • 它可以作為一個集合(稱為 線程組)管理相關的線程。
  • 它管理各個線程的調度優先順序。
  • 它允許在線程之間進行同步。
  • 它可以修改線程屬性,比如堆棧大小。

表 1 介紹 ACE_Thread_Manager 類的重要方法。


表 1. ACE_Thread_Manager 類的方法
方法名 說明
instance ACE_Thread_Manager 類是一個單實例類,使用這個方法訪問線程管理器的惟一實例。
spawn 這個方法創建一個新線程,它的一個輸入參數是 C/C++ 函數指針,這個函數執行應用程序的特定工作。
exit 這個方法終止一個線程,釋放這個線程的所有資源。
spawn_n 這個方法創建屬於同一個線程組的多個線程。
close 這個方法關閉已經創建的所有線程並釋放它們的資源。
suspend 線程管理器暫停指定的線程。
resume 線程管理器恢復執行前面暫停的線程。

使用 ACE_Thread_Manager 類的變體

可以作為單實例類使用 ACE_Thread_Manager 類,也可以創建這個類的多個實例。對於單一實例,通過調用 instance 方法訪問實例。如果需要管理多個線程組,可以創建不同的線程管理器類,每個類控制它自己的線程集。

清單 1 中的示例創建一個線程。


清單 1. 使用 ACE_Thread_Manager 類創建一個線程
				  #include "ace/Thread_Manager.h"  #include <iostream>    void thread_start(void* arg)  {    std::cout << "Running thread..\n";  }    int ACE_TMAIN (int argc, ACE_TCHAR* argv[])  {    ACE_Thread_Manager::instance()->spawn((ACE_THR_FUNC)thread_start);    return 0;  }  

清單 2 給出 spawn() 方法的原型(取自 ace/Thread_Manager.h)。


清單 2. ACE_Thread_Manager::spawn 方法的原型
				    int spawn (ACE_THR_FUNC func,               void *arg = 0,               long flags = THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED,               ACE_thread_t *t_id = 0,               ACE_hthread_t *t_handle = 0,               long priority = ACE_DEFAULT_THREAD_PRIORITY,               int grp_id = -1,               void *stack = 0,               size_t stack_size = ACE_DEFAULT_THREAD_STACKSIZE,               const char** thr_name = 0);  

對於初學者來說,創建線程需要的參數數量似乎太多了,所以我們詳細討論一下各個參數和它們的作用:

  • ACE_THR_FUNC func:這是在生成線程時調用的函數。
  • void* arg:這是在生成線程時調用的函數的參數。void* 意味著用戶可以傳遞應用程序特有的任何數據類型,甚至可以使用某種結構把多個參數組合成單一數據。
  • long flags:使用 flags 變數設置生成的線程的幾個屬性。各個屬性都由單一位表示,按照 “或” 關係組合在一起。表 2 說明一些屬性。
  • ACE_thread_t *t_id:使用這個函數訪問創建的線程的 ID。每個線程具有惟一的 ID。
  • long priority:這是生成的線程的優先順序。
  • int grp_id:如果提供這個參數,那麼它表示生成的線程是否屬於現有的某一線程組。如果傳遞 -1,那麼創建新的線程組並在這個組中添加生成的線程。
  • void* stack:這是預先分配的堆棧區域的指針。如果提供 0,就請求操作系統提供生成的線程的堆棧區域。
  • size_t stack_size:這個參數指定線程堆棧的大小(位元組數)。如果對於前一個參數(堆棧指針)指定了 0,那麼請求操作系統提供大小為 stack_size 的堆棧區域。
  • const char** thr_name:這個參數只與支持線程命名的平台(比如 VxWorks)相關。對於 UNIX 平台,在大多數情況下忽略它。

表 2. 線程屬性及其說明
線程創建標誌 說明
THR_CANCEL_DISABLE 不允許取消這個線程。
THR_CANCEL_ENABLE 允許取消這個線程。
THR_DETACHED 創建非同步線程。線程的退出狀態對於其他任何線程不可用。當線程終止時,操作系統回收線程資源。
THR_JOINABLE 允許新線程的退出狀態對於其他線程可用。這也是 ACE 創建的線程的默認屬性。當這種線程終止時,操作系統不回收線程資源,直到其他線程聯結它為止。
THR_NEW_LWP 創建顯式的內核級線程(而不是用戶級線程)。
THR_SUSPENDED 創建處於暫停狀態的新線程。

清單 3 中的示例使用線程管理器類的 spawn_n 方法創建多個線程。


清單 3. 使用 ACE_Thread_Manager 類創建多個線程
				  #include "ace/Thread_Manager.h"  #include <iostream>    void print (void* args)  {    int id = ACE_Thread_Manager::instance()->thr_self();    std::cout << "Thread Id: " << id << std::endl;  }    int ACE_TMAIN (int argc, ACE_TCHAR* argv[])  {    ACE_Thread_Manager::instance()->spawn_n(        4, (ACE_THR_FUNC) print, 0, THR_JOINABLE | THR_NEW_LWP);      ACE_Thread_Manager::instance()->wait();    return 0;  }  





ACE 中的另一種線程創建機制

本節討論 ACE 提供的另一種線程創建/管理機制。這種方法不需要對線程管理器進行顯式的細粒度的控制。在默認情況下,每個進程在創建時有一個線程,這個線程在 main 函數開始時啟動,在 main 結束時終止。其他線程都需要顯式地創建。創建線程的另一種方式是創建預定義的 ACE_Task_Base 類的子類,然後覆蓋 svc() 方法。新線程在 svc() 方法中啟動,在 svc() 方法返回時終止。在進一步解釋之前,請看一下 清單 4 所示的源代碼。


清單 4. 使用 ACE_Task_Base::svc 創建線程
				  #include “ace/Task.h”    class Thread_1 : public ACE_Task_Base {     public:       virtual int svc( ) {          std::cout << “In child’s thread\n”;         return 0;      }   };    int main ( )  {      Thread_1 th1;     th1.activate(THR_NEW_LWP|THR_JOINABLE);     th1.wait();     return 0;  }  


[火星人 ] 使用 ACE 庫框架在 UNIX 中開發高性能併發應用已經有894次圍觀

http://coctec.com/docs/linux/show-post-68787.html