欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

  • 線程將指定函數(shù)體中的代碼執(zhí)行完后自行結束;
  • 線程執(zhí)行過程中,被同一進程中的其它線程(包括主線程)強制終止;
  • 線程執(zhí)行過程中,遇到 pthread_exit() 函數(shù)結束執(zhí)行。

注意,默認屬性的線程執(zhí)行結束后并不會立即釋放占用的資源,直到整個進程執(zhí)行結束,所有線程的資源以及整個進程占用的資源才會被操作系統(tǒng)回收。
實現(xiàn)線程資源及時回收的常用方法有兩種,一種是修改線程屬性,另一種是在另一個線程中調用 pthread_join() 函數(shù),我們會在后續(xù)章節(jié)中給您詳細介紹這兩種方法。

線程結束執(zhí)行的 3 種方式中,第 1 種很容易理解,我們會在《pthread_cancel()函數(shù)》一文中介紹第 2 種方式,本文重點講解 pthread_exit() 函數(shù)的功能和用法。

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

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

void pthread_exit(void *retval);

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

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

接下來通過一個樣例,給大家演示 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"); //返回的字符串存儲在常量區(qū),并非當前線程的私有資源
    printf("*****************");//此語句不會被線程執(zhí)行
}
int main()
{
    int res;
    //創(chuàng)建一個空指針
    void * thread_result;
    //定義一個表示線程的變量
    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;
}

假設程序存儲在 thread.c 文件中,執(zhí)行過程如下:

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

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

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

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

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

return "http://jb51.net";

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

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

首先,return 語句和 pthread_exit() 函數(shù)的含義不同,return 的含義是返回,它不僅可以用于線程執(zhí)行的函數(shù),普通函數(shù)也可以使用;pthread_exit() 函數(shù)的含義是線程退出,它專門用于結束某個線程的執(zhí)行。

在主線程(main() 函數(shù))中,return 和 pthread_exit() 函數(shù)的區(qū)別最明顯。舉個例子:

#include <stdio.h>
#include <pthread.h>
void *ThreadFun(void *arg)
{
    sleep(5);//等待一段時間
    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í)行此程序,輸出結果為:
腳本之家

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

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

pthread_exit(NULL);

重新編譯、執(zhí)行程序,運行結果為:

腳本之家
http://jb51.net

對比上面兩個執(zhí)行結果,我們可以得出的結論是:pthread_exit() 函數(shù)只會終止當前線程,不會影響進程中其它線程的執(zhí)行。

此外,pthread_exit() 可以自動調用線程清理程序(本質是一個由 pthread_cleanup_push() 指定的自定義函數(shù)),return 則不具備這個能力??傊趯嶋H場景中,如果想終止某個子線程執(zhí)行,強烈建議大家使用 pthread_exit() 函數(shù)。終止主線程時,return 和 pthread_exit() 函數(shù)發(fā)揮的功能不同,可以根據(jù)需要自行選擇。

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

相關文章

  • C++作用域與函數(shù)重載的實現(xiàn)

    C++作用域與函數(shù)重載的實現(xiàn)

    本文主要介紹了C++作用域與函數(shù)重載的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C語言實現(xiàn)銷售管理系統(tǒng)設計

    C語言實現(xiàn)銷售管理系統(tǒng)設計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)銷售管理系統(tǒng)設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++函數(shù)對象詳解附帶實例

    C++函數(shù)對象詳解附帶實例

    這篇文章主要介紹了C++函數(shù)對象詳解附帶實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C++模擬實現(xiàn)list功能

    C++模擬實現(xiàn)list功能

    list的底層是一個循環(huán)雙向鏈表結構,雙向鏈表中每個元素存儲在互不相關的獨立節(jié)點中,在節(jié)點中通過指針指向其前一個元素和后一個元素,接下來通過本文給大家分享C++模擬實現(xiàn)list的示例代碼,需要的朋友可以參考下
    2021-08-08
  • 分享C++面試中string類的一種正確寫法

    分享C++面試中string類的一種正確寫法

    C++ 的一個常見面試題是讓你實現(xiàn)一個 String 類,限于時間,不可能要求具備 std::string 的功能,但至少要求能正確管理資源
    2013-11-11
  • C++中類的成員函數(shù)及內聯(lián)函數(shù)使用及說明

    C++中類的成員函數(shù)及內聯(lián)函數(shù)使用及說明

    這篇文章主要介紹了C++中類的成員函數(shù)及內聯(lián)函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實現(xiàn)添加桌面右鍵新建菜單

    C++實現(xiàn)添加桌面右鍵新建菜單

    本文給大家匯總了3個版本的C++實現(xiàn)添加桌面右鍵新建菜單的代碼,陸陸續(xù)續(xù)寫的,有需要的小伙伴可以根據(jù)自己的需求來選擇
    2016-01-01
  • C/C++中不同數(shù)據(jù)類型之間的轉換詳解

    C/C++中不同數(shù)據(jù)類型之間的轉換詳解

    這篇文章主要介紹了C/C++中不同數(shù)據(jù)類型之間的轉換詳解,數(shù)據(jù)類型轉換是計算機編程中常見的操作,用于將一個數(shù)據(jù)類型轉換為另一個數(shù)據(jù)類型,本文將對不同數(shù)據(jù)類型之間的轉換作出說明,需要的朋友可以參考下
    2023-10-10
  • c++ vector模擬實現(xiàn)代碼

    c++ vector模擬實現(xiàn)代碼

    vector是C++ STL中一個非常重要的容器,了解 vector 的底層實現(xiàn)原理,可以很好的幫助我們更加熟練的使用vector。這篇文章通過實例代碼給大家介紹c++ vector模擬實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2020-02-02
  • C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例

    C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例

    這篇文章主要介紹了C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法,涉及C++針對日期時間的數(shù)值運算相關操作技巧,需要的朋友可以參考下
    2017-07-07

最新評論