最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程

 更新時(shí)間:2023年05月15日 09:37:49   作者:C語(yǔ)言中文網(wǎng)  
本文主要介紹了C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

多線程編程中,線程結(jié)束執(zhí)行的方式有 3 種,分別是:

  • 線程將指定函數(shù)體中的代碼執(zhí)行完后自行結(jié)束;
  • 線程執(zhí)行過(guò)程中,被同一進(jìn)程中的其它線程(包括主線程)強(qiáng)制終止;
  • 線程執(zhí)行過(guò)程中,遇到 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ù)的功能和用法。

pthread_exit()函數(shù)的用法

Linux pthread_exit() 函數(shù)聲明在<pthread.h>頭文件中,語(yǔ)法格式如下所示:

void pthread_exit(void *retval);

retval 是 void* 類(lèi)型的指針,可以指向任何類(lèi)型的數(shù)據(jù),它指向的數(shù)據(jù)將作為線程退出時(shí)的返回值。如果線程不需要返回任何數(shù)據(jù),將 retval 參數(shù)置為 NULL 即可。

注意,retval 指針不能指向函數(shù)內(nèi)部的局部數(shù)據(jù)(比如局部變量)。換句話說(shuō),pthread_exit() 函數(shù)不能返回一個(gè)指向局部數(shù)據(jù)的指針,否則很可能使程序運(yùn)行結(jié)果出錯(cuò)甚至崩潰。

接下來(lái)通過(guò)一個(gè)樣例,給大家演示 pthread_exit() 函數(shù)的用法(樣例一):

#include <stdio.h>
#include <pthread.h>
//線程要執(zhí)行的函數(shù),arg 用來(lái)接收線程傳遞過(guò)來(lái)的數(shù)據(jù)
void *ThreadFun(void *arg)
{
    //終止線程的執(zhí)行,將“http://c.biancheng.net”返回
    pthread_exit("http://c.biancheng.net"); //返回的字符串存儲(chǔ)在常量區(qū),并非當(dāng)前線程的私有資源
    printf("*****************");//此語(yǔ)句不會(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í)行過(guò)程如下:

[root@localhost ~]# gcc thread.c -o thread.exe -lpthread
[root@localhost ~]# ./thread.exe
http://c.biancheng.net

通過(guò)執(zhí)行結(jié)果不難看出,myThread 線程并沒(méi)有執(zhí)行 ThreadFun() 函數(shù)中最后一個(gè) printf() 語(yǔ)句,從側(cè)面驗(yàn)證了 pthread_exit() 函數(shù)的功能。此外,我們通過(guò)在主線程(main() 函數(shù))調(diào)用 pthread_join() 函數(shù),獲取到了 myThread 線程返回的數(shù)據(jù)。有關(guān) pthread_join() 函數(shù)的功能和用法,我們會(huì)在《獲取線程函數(shù)返回值》一節(jié)中給大家講解。

pthread_exit() 和 return 的區(qū)別

如果想在線程執(zhí)行結(jié)束時(shí)返回指定的數(shù)據(jù),除了用 pthread_exit() 函數(shù)外,還可以使用 return 語(yǔ)句。

修改樣例一中的程序,將第 8 行(調(diào)用 pthread_exit() )代碼替換成如下語(yǔ)句:

return "http://jb51.net";

重新編譯、執(zhí)行此程序,會(huì)發(fā)現(xiàn)程序的執(zhí)行結(jié)果和之前完全相同。這意味著當(dāng)線程執(zhí)行結(jié)束時(shí),無(wú)論是采用 return 語(yǔ)句還是調(diào)用 pthread_exit() 函數(shù),主線程中的 pthread_join() 函數(shù)都可以接收到線程的返回值。

那么,return 語(yǔ)句和 pthread_exit() 函數(shù)的區(qū)別是什么呢?

首先,return 語(yǔ)句和 pthread_exit() 函數(shù)的含義不同,return 的含義是返回,它不僅可以用于線程執(zhí)行的函數(shù),普通函數(shù)也可以使用;pthread_exit() 函數(shù)的含義是線程退出,它專(zhuān)門(mén)用于結(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://jb51.net\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é)果為:
腳本之家

通過(guò)執(zhí)行結(jié)果可以看到,主線程正常執(zhí)行結(jié)束,myThread 線程并沒(méi)有輸出指定的數(shù)據(jù)。原因很簡(jiǎn)單,主線程執(zhí)行速度很快,主線程最后執(zhí)行的 return 語(yǔ)句不僅會(huì)終止主線程執(zhí)行,還會(huì)終止其它子線程執(zhí)行。也就是說(shuō),myThread 線程還沒(méi)有執(zhí)行輸出語(yǔ)句就被終止了。

將上面程序中,main() 函數(shù)中的return 0;用如下語(yǔ)句替換:

pthread_exit(NULL);

重新編譯、執(zhí)行程序,運(yùn)行結(jié)果為:

腳本之家
http://jb51.net

對(duì)比上面兩個(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í)際場(chǎng)景中,如果想終止某個(gè)子線程執(zhí)行,強(qiáng)烈建議大家使用 pthread_exit() 函數(shù)。終止主線程時(shí),return 和 pthread_exit() 函數(shù)發(fā)揮的功能不同,可以根據(jù)需要自行選擇。

到此這篇關(guān)于C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程的文章就介紹到這了,更多相關(guān)pthread_exit()終止線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)職工管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 從C++單例模式到線程安全詳解

    從C++單例模式到線程安全詳解

    下面小編就為大家?guī)?lái)一篇從C++單例模式到線程安全詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C++中的Qt?QTableView詳解

    C++中的Qt?QTableView詳解

    這篇文章主要介紹了Qt?QTableView詳解,主要包括常用接口,設(shè)置item屬性,右鍵彈出菜單,結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C語(yǔ)言的分支和循環(huán)語(yǔ)句你了解嗎

    C語(yǔ)言的分支和循環(huán)語(yǔ)句你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的分支和循環(huán)語(yǔ)句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C語(yǔ)言操作符基礎(chǔ)知識(shí)詳解

    C語(yǔ)言操作符基礎(chǔ)知識(shí)詳解

    這篇文章主要以圖文結(jié)合的方式為大家詳細(xì)介紹了C語(yǔ)言位運(yùn)算基礎(chǔ)知識(shí),感興趣的小伙伴們可以參考一下,希望能給你帶來(lái)幫助
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的構(gòu)建

    C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的構(gòu)建

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)哈夫曼樹(shù)的構(gòu)建,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++命名空間使用詳細(xì)介紹

    C++命名空間使用詳細(xì)介紹

    考慮一種情況,當(dāng)我們有兩個(gè)同名的人,Zara,在同一個(gè)班里。當(dāng)我們需要對(duì)它們進(jìn)行區(qū)分我們必須使用一些額外的信息和它們的名字,比如它們生活在不同的區(qū)域或者興趣愛(ài)好什么的,在C++程序中也會(huì)遇到同樣的情況,所以命名空間就此產(chǎn)生
    2022-09-09
  • C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn)詳解

    C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn)詳解

    這篇文章主要介紹了C標(biāo)準(zhǔn)庫(kù)<assert.h>的實(shí)現(xiàn),主要包括了<assert.h>的基本概念、實(shí)現(xiàn)及用法等,需要的朋友可以參考下
    2014-09-09
  • Qt自定義美化滑動(dòng)條

    Qt自定義美化滑動(dòng)條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義美化滑動(dòng)條的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 深入講解Socket原理

    深入講解Socket原理

    這篇文章深入的講解Socket原理,并附帶實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-12-12

最新評(píng)論

花垣县| 普兰店市| 奇台县| 炎陵县| 凤冈县| 克山县| 太白县| 麟游县| 宝应县| 宜宾市| 孝昌县| 普兰店市| 田东县| 正蓝旗| 盐亭县| 德化县| 安新县| 宝清县| 金昌市| 五常市| 东莞市| 大名县| 和林格尔县| 阳高县| 云霄县| 色达县| 永和县| 大港区| 扬中市| 扎兰屯市| 福鼎市| 磐安县| 方正县| 乌拉特前旗| 厦门市| 光山县| 大新县| 荆门市| 峡江县| 炎陵县| 大洼县|