有過在不同的操作系統下用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創建一個線程。
#include "ace/Thread.h"
#include "ace/Synch.h"
#include <iostream>
using namespace
std;
void* worker(void *arg)
{
for(int
i=0;i<10;i++)
{
ACE_OS::sleep(1);
cout<<endl<<"hello world"<<endl;
}
return NULL;
}
int main(int argc,
char *argv[])
{
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::join(threadHandle);
return 0;
}
在這個簡單的例子中,創建了1個工作者線程,執行程序中定義的worker()函數。然后阻塞主函數,待線程結束后退出程序。
posted on 2009-07-28 16:05
老馬驛站 閱讀(374)
評論(0) 編輯 收藏 引用 所屬分類:
ACE