ACE線程管理機制-線程的創建與管理

本貼轉自http://www.cnblogs.com/TianFang/category/78013.html  作者:天方

 

有過在不同的操作系統下用c++進行過多線程編程的朋友對那些線程處理的API可能深有體會,這些API提供了相同或是相似的功能,但是它們的API的差別卻極爲懸殊,十分令人頭痛。

ACE_Thread提供了對不同OS的線程調用的簡單包裝,通過一個通用的接口進行處理線程創建、掛起、取消和刪除等問題。

一. 線程入口函數

所有線程必須從一個指定的函數開始執行,該函數稱爲線程函數,它必須具有下列原型:
void * worker(void *arg) {}
該函數輸入一個 void * 型的參數,可以在創建線程時傳入。
注意: 所有的線程啓動函數(方法)必須是靜態的或全局的(就如同直接使用OS線程API時所要求的一樣)。

二.線程基本操作

1.創建一個線程

一個進程的主線程是由操作系統自動生成,如果你要讓一個主線程創建額外的線程,可以通過ACE_Thread::spawn() 實現,該函數一般的使用方式如下:

    ACE_thread_t threadId;
    ACE_hthread_t threadHandle;

    ACE_Thread::spawn(
        (ACE_THR_FUNC)worker,        //線程執行函數
        NULL,                        //執行函數參數
        THR_JOINABLE | THR_NEW_LWP,
        &threadId,
        &threadHandle
        );

爲了簡化,也可以使用其默認參數,直接使用ACE_Thread::spawn((ACE_THR_FUNC)worker) 來創建一個worker的線程。

另外,ACE還提供了ACE_Thread::spawn_n函數 來創建多個線程。

2.終止線程

在線程函數體中ACE_Thread::exit() 調用即可終止線程執行。

3.設定線程的相對優先級

當一個線程被首次創建時,它的優先級等同於它所屬進程的優先級。一個線程的優先級是相對於其所屬的進程的優先級而言的。可以通過調用 ACE_Thread::setprio 函數改變線程的相對優先級,該函數的調用方式如下:
ACE_Thread::setprio(threadHandle,ACE_DEFAULT_THREAD_PRIORITY)

4.掛起及恢復線程

掛起線程可以通過來實現,它能暫停一個線程的執行,其調用方式如下ACE_Thread::suspend(threadHandle)
相應的,可以通過ACE_Thread::resume(threadHandle) 恢復被掛起的線程的執行。

5.等待線程結束

在主函數中調用ACE_Thread::join(threadHandle) 可阻塞主函數,直道線程結束才能繼續執行。

6.停止線程

在主函數中調用ACE_Thread::cancel (threadHandle) 可停止線程的執行(在Unix底下可以,而在windows下好像不起作用,有待檢驗)。

三.程序示例

下面例子演示瞭如何用ace創建一個線程。

 

 

在這個簡單的例子中,創建了1個工作者線程,執行程序中定義的worker()函數。然後阻塞主函數,待線程結束後退出程序。

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