您好,登錄后才能下訂單哦!
本篇文章和大家了解一下C語言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程的方法。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對大家有所幫助。
多線程編程中,線程結(jié)束執(zhí)行的方式有 3 種,分別是:
線程將指定函數(shù)體中的代碼執(zhí)行完后自行結(jié)束;
線程執(zhí)行過程中,被同一進(jìn)程中的其它線程(包括主線程)強(qiáng)制終止;
線程執(zhí)行過程中,遇到 pthread_exit() 函數(shù)結(jié)束執(zhí)行。
注意,默認(rèn)屬性的線程執(zhí)行結(jié)束后并不會(huì)立即釋放占用的資源,直到整個(gè)進(jìn)程執(zhí)行結(jié)束,所有線程的資源以及整個(gè)進(jìn)程占用的資源才會(huì)被操作系統(tǒng)回收。
實(shí)現(xiàn)線程資源及時(shí)回收的常用方法有兩種,一種是修改線程屬性,另一種是在另一個(gè)線程中調(diào)用 pthread_join() 函數(shù),我們會(huì)在后續(xù)章節(jié)中給您詳細(xì)介紹這兩種方法。
線程結(jié)束執(zhí)行的 3 種方式中,第 1 種很容易理解,我們會(huì)在《pthread_cancel()函數(shù)》一文中介紹第 2 種方式,本文重點(diǎn)講解 pthread_exit() 函數(shù)的功能和用法。
Linux pthread_exit() 函數(shù)聲明在<pthread.h>頭文件中,語法格式如下所示:
void pthread_exit(void *retval);
retval 是 void* 類型的指針,可以指向任何類型的數(shù)據(jù),它指向的數(shù)據(jù)將作為線程退出時(shí)的返回值。如果線程不需要返回任何數(shù)據(jù),將 retval 參數(shù)置為 NULL 即可。
注意,retval 指針不能指向函數(shù)內(nèi)部的局部數(shù)據(jù)(比如局部變量)。換句話說,pthread_exit() 函數(shù)不能返回一個(gè)指向局部數(shù)據(jù)的指針,否則很可能使程序運(yùn)行結(jié)果出錯(cuò)甚至崩潰。
接下來通過一個(gè)樣例,給大家演示 pthread_exit() 函數(shù)的用法(樣例一):
#include <stdio.h> #include <pthread.h> //線程要執(zhí)行的函數(shù),arg 用來接收線程傳遞過來的數(shù)據(jù) void *ThreadFun(void *arg) { //終止線程的執(zhí)行,將“http://c.biancheng.net”返回 pthread_exit("http://c.biancheng.net"); //返回的字符串存儲(chǔ)在常量區(qū),并非當(dāng)前線程的私有資源 printf("*****************");//此語句不會(huì)被線程執(zhí)行 } int main() { int res; //創(chuàng)建一個(gè)空指針 void * thread_result; //定義一個(gè)表示線程的變量 pthread_t myThread; res = pthread_create(&myThread, NULL, ThreadFun, NULL); if (res != 0) { printf("線程創(chuàng)建失敗"); return 0; } //等待 myThread 線程執(zhí)行完成,并用 thread_result 指針接收該線程的返回值 res = pthread_join(myThread, &thread_result); if (res != 0) { printf("等待線程失敗"); } printf("%s", (char*)thread_result); return 0; }
假設(shè)程序存儲(chǔ)在 thread.c 文件中,執(zhí)行過程如下:
[root@localhost ~]# gcc thread.c -o thread.exe -lpthread [root@localhost ~]# ./thread.exe http://c.biancheng.net
通過執(zhí)行結(jié)果不難看出,myThread 線程并沒有執(zhí)行 ThreadFun() 函數(shù)中最后一個(gè) printf() 語句,從側(cè)面驗(yàn)證了 pthread_exit() 函數(shù)的功能。此外,我們通過在主線程(main() 函數(shù))調(diào)用 pthread_join() 函數(shù),獲取到了 myThread 線程返回的數(shù)據(jù)。有關(guān) pthread_join() 函數(shù)的功能和用法,我們會(huì)在《獲取線程函數(shù)返回值》一節(jié)中給大家講解。
如果想在線程執(zhí)行結(jié)束時(shí)返回指定的數(shù)據(jù),除了用 pthread_exit() 函數(shù)外,還可以使用 return 語句。
修改樣例一中的程序,將第 8 行(調(diào)用 pthread_exit() )代碼替換成如下語句:
return "http://yisu.com";
重新編譯、執(zhí)行此程序,會(huì)發(fā)現(xiàn)程序的執(zhí)行結(jié)果和之前完全相同。這意味著當(dāng)線程執(zhí)行結(jié)束時(shí),無論是采用 return 語句還是調(diào)用 pthread_exit() 函數(shù),主線程中的 pthread_join() 函數(shù)都可以接收到線程的返回值。
那么,return 語句和 pthread_exit() 函數(shù)的區(qū)別是什么呢?
首先,return 語句和 pthread_exit() 函數(shù)的含義不同,return 的含義是返回,它不僅可以用于線程執(zhí)行的函數(shù),普通函數(shù)也可以使用;pthread_exit() 函數(shù)的含義是線程退出,它專門用于結(jié)束某個(gè)線程的執(zhí)行。
在主線程(main() 函數(shù))中,return 和 pthread_exit() 函數(shù)的區(qū)別最明顯。舉個(gè)例子:
#include <stdio.h> #include <pthread.h> void *ThreadFun(void *arg) { sleep(5);//等待一段時(shí)間 printf("http://yisu.com\n"); } int main() { int res; pthread_t myThread; res = pthread_create(&myThread, NULL, ThreadFun, NULL); if (res != 0) { printf("線程創(chuàng)建失敗"); return 0; } printf("億速云\n"); return 0; } 編譯、執(zhí)行此程序,輸出結(jié)果為: 億速云
通過執(zhí)行結(jié)果可以看到,主線程正常執(zhí)行結(jié)束,myThread 線程并沒有輸出指定的數(shù)據(jù)。原因很簡單,主線程執(zhí)行速度很快,主線程最后執(zhí)行的 return 語句不僅會(huì)終止主線程執(zhí)行,還會(huì)終止其它子線程執(zhí)行。也就是說,myThread 線程還沒有執(zhí)行輸出語句就被終止了。
將上面程序中,main() 函數(shù)中的return 0;用如下語句替換:
pthread_exit(NULL);
重新編譯、執(zhí)行程序,運(yùn)行結(jié)果為:
億速云
http://yisu.com
對比上面兩個(gè)執(zhí)行結(jié)果,我們可以得出的結(jié)論是:pthread_exit() 函數(shù)只會(huì)終止當(dāng)前線程,不會(huì)影響進(jìn)程中其它線程的執(zhí)行。
此外,pthread_exit() 可以自動(dòng)調(diào)用線程清理程序(本質(zhì)是一個(gè)由 pthread_cleanup_push() 指定的自定義函數(shù)),return 則不具備這個(gè)能力??傊趯?shí)際場景中,如果想終止某個(gè)子線程執(zhí)行,強(qiáng)烈建議大家使用 pthread_exit() 函數(shù)。終止主線程時(shí),return 和 pthread_exit() 函數(shù)發(fā)揮的功能不同,可以根據(jù)需要自行選擇。
以上就是C語言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程的方法的簡略介紹,當(dāng)然詳細(xì)使用上面的不同還得要大家自己使用過才領(lǐng)會(huì)。如果想了解更多,歡迎關(guān)注億速云行業(yè)資訊頻道哦!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。