有過在不同的操作系統(tǒng)下用c++進行過多線程編程的朋友對那些線程處理的API可能深有體會,這些API提供了相同或是相似的功能,但是它們的API的差別卻極為懸殊,十分令人頭痛。
ACE_Thread提供了對不同OS的線程調用的簡單包裝,通過一個通用的接口進行處理線程創(chuàng)建、掛起、取消和刪除等問題。
一. 線程入口函數(shù)
所有線程必須從一個指定的函數(shù)開始執(zhí)行,該函數(shù)稱為線程函數(shù),它必須具有下列原型:
void* worker(void
*arg) {}
該函數(shù)輸入一個void *型的參數(shù),可以在創(chuàng)建線程時傳入。
注意:所有的線程啟動函數(shù)(方法)必須是靜態(tài)的或全局的(就如同直接使用OS線程API時所要求的一樣)。
二.線程基本操作
1.創(chuàng)建一個線程
一個進程的主線程是由操作系統(tǒng)自動生成,如果你要讓一個主線程創(chuàng)建額外的線程,可以通過ACE_Thread::spawn()實現(xiàn),該函數(shù)一般的使用方式如下:
ACE_thread_t threadId;
ACE_hthread_t
threadHandle;
ACE_Thread::spawn(
(ACE_THR_FUNC)worker, //線程執(zhí)行函數(shù)
NULL, //執(zhí)行函數(shù)參數(shù)
THR_JOINABLE |
THR_NEW_LWP,
&threadId,
&threadHandle
);
為了簡化,也可以使用其默認參數(shù),直接使用ACE_Thread::spawn((ACE_THR_FUNC)worker)
來創(chuàng)建一個worker的線程。
另外,ACE還提供了ACE_Thread::spawn_n函數(shù)來創(chuàng)建多個線程。
2.終止線程
在線程函數(shù)體中ACE_Thread::exit()調用即可終止線程執(zhí)行。
3.設定線程的相對優(yōu)先級
當一個線程被首次創(chuàng)建時,它的優(yōu)先級等同于它所屬進程的優(yōu)先級。一個線程的優(yōu)先級是相對于其所屬的進程的優(yōu)先級而言的。可以通過調用ACE_Thread::setprio函數(shù)改變線程的相對優(yōu)先級,該函數(shù)的調用方式如下:
ACE_Thread::setprio(threadHandle,ACE_DEFAULT_THREAD_PRIORITY)
4.掛起及恢復線程
掛起線程可以通過來實現(xiàn),它能暫停一個線程的執(zhí)行,其調用方式如下ACE_Thread::suspend(threadHandle)
。
相應的,可以通過ACE_Thread::resume(threadHandle) 恢復被掛起的線程的執(zhí)行。
5.等待線程結束
在主函數(shù)中調用ACE_Thread::join(threadHandle)可阻塞主函數(shù),直道線程結束才能繼續(xù)執(zhí)行。
6.停止線程
在主函數(shù)中調用ACE_Thread::cancel
(threadHandle)可停止線程的執(zhí)行(在Unix底下可以,而在windows下好像不起作用,有待檢驗)。
三.程序示例
下面例子演示了如何用ace創(chuàng)建一個線程。
#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, //線程執(zhí)行函數(shù)
NULL, //執(zhí)行函數(shù)參數(shù)
THR_JOINABLE
|
THR_NEW_LWP,
&threadId,
&threadHandle
);
ACE_Thread::join(threadHandle);
return 0;
}
在這個簡單的例子中,創(chuàng)建了1個工作者線程,執(zhí)行程序中定義的worker()函數(shù)。然后阻塞主函數(shù),待線程結束后退出程序。
posted on 2009-07-28 16:05
老馬驛站 閱讀(389)
評論(0) 編輯 收藏 引用 所屬分類:
ACE