有三種方式可以終止線程,具體調(diào)用函數(shù)依賴于使用的線程系統(tǒng)。
為南岸等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及南岸網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計、南岸網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
1 在線程入口函數(shù)中,調(diào)用return。 即退出線程入口函數(shù),可以實(shí)現(xiàn)終止當(dāng)前線程效果;
2 在線程執(zhí)行的任意函數(shù),調(diào)用當(dāng)前線程退出函數(shù),可以退出當(dāng)前線程;
3 在任意位置,調(diào)用線程終止函數(shù),并傳入要終止線程的標(biāo)識符,即pid,可以實(shí)現(xiàn)終止對應(yīng)線程效果。
調(diào)用ExitThread函數(shù)。
該函數(shù)將終止線程的運(yùn)行,并導(dǎo)致操作系統(tǒng)清除該線程使用的所有操作系統(tǒng)資源。但是,C++資源(如C++類對象)將不被撤消。
(3) 調(diào)用TerminateThread函數(shù)。
TerminateThread 能撤消任何線程。線程的內(nèi)核對象的使用計數(shù)也被遞減。TerminateThread函數(shù)是異步運(yùn)行的函數(shù)。如果要確切地知道該線程已經(jīng)終止運(yùn)行,必須調(diào)用WaitForSingleObject或者類似的函數(shù)。當(dāng)使用返回或調(diào)用ExitThread的方法撤消線程時,該線程的內(nèi)存堆棧也被撤消。但是,如果使用TerminateThread,那么在擁有線程的進(jìn)程終止運(yùn)行之前,系統(tǒng)不撤消該線程的堆棧。
1、添加線程相關(guān)的頭文件:#includepthread.h
2、線程創(chuàng)建函數(shù)是pthread_create()函數(shù),該函數(shù)的原型為:
int?pthread_create(pthread_t?*thread,pthread_attr_t?*attr,void*?(*start_routine)(void*),void?*arg);
3、線程退出函數(shù)是pthread_exit()函數(shù),該函數(shù)的原型為:
void?pthread_exit(void?*retval);
創(chuàng)建線程的示例程序如下:
/*
**程序說明:創(chuàng)建線程函數(shù)pthread_create()函數(shù)的使用。
*/
#include?stdio.h
#include?pthread.h
#include?unistd.h
#include?stdlib.h
#include?string.h
//打印標(biāo)識符的函數(shù)
void?print_ids(const?char?*str)
{
pid_t?pid; //進(jìn)程標(biāo)識符
pthread_t?tid; //線程標(biāo)識符
pid=getpid(); //獲得進(jìn)程號
tid=pthread_self(); //獲得線程號
printf("%s?pid:%u?tid:%u?(0x%x)\n",
str,(unsigned?int)pid,(unsigned?int)tid,(unsigned?int)tid);?//打印進(jìn)程號和線程號
}
//線程函數(shù)
void*?pthread_func(void?*arg)
{
print_ids("new?thread:"); //打印新建線程號
return?((void*)0);
}
//主函數(shù)
int?main()
{
int?err;
pthread_t?ntid; //線程號
err=pthread_create(ntid,NULL,pthread_func,NULL); //創(chuàng)建一個線程
if(err?!=?0)
{
printf("create?thread?failed:%s\n",strerror(err));
exit(-1);
}
print_ids("main?thread:"); //打印主線程號
sleep(2);
return?0;
}