本貼轉自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()函數。然後阻塞主函數,待線程結束後退出程序。