ACE 開放源碼工具包可以幫助開發人員創建健壯的可移植多線程應用程序。本文討論創建使用 ACE 線程的應用程序的一些方法。
Adaptive Communication Environment (ACE) 是一個高性能、開放源碼、面向對象的框架和 C++ 類庫,它有助於簡化網路應用程序的開發。ACE 工具包包括一個操作系統層和一個封裝網路 API 的 C++ 外觀(facades)集合。本文討論如何使用 ACE 線程設計高性能、併發、面向對象的網路應用程序。對 ACE 的完整說明,包括如何下載和安裝這個工具包,請參見 參考資料。
用於創建和管理線程的 ACE 類
在進程中生成和管理多個線程涉及下面的類:
了解線程管理器類
原生操作系統線程 API 是不可移植的:存在語法和語義差異。例如,UNIX® pthread_create() 和 Windows® CreateThread() 方法都創建線程,但是語法不一樣。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 中的示例創建一個線程。
#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)。
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); |
對於初學者來說,創建線程需要的參數數量似乎太多了,所以我們詳細討論一下各個參數和它們的作用:
線程創建標誌 | 說明 |
---|---|
THR_CANCEL_DISABLE | 不允許取消這個線程。 |
THR_CANCEL_ENABLE | 允許取消這個線程。 |
THR_DETACHED | 創建非同步線程。線程的退出狀態對於其他任何線程不可用。當線程終止時,操作系統回收線程資源。 |
THR_JOINABLE | 允許新線程的退出狀態對於其他線程可用。這也是 ACE 創建的線程的默認屬性。當這種線程終止時,操作系統不回收線程資源,直到其他線程聯結它為止。 |
THR_NEW_LWP | 創建顯式的內核級線程(而不是用戶級線程)。 |
THR_SUSPENDED | 創建處於暫停狀態的新線程。 |
清單 3 中的示例使用線程管理器類的 spawn_n 方法創建多個線程。
#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 所示的源代碼。
#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 中開發高性能併發應用已經有963次圍觀