91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中pthread_exit()函數實現終止線程的方法

發布時間:2023-07-04 09:08:39 來源:億速云 閱讀:89 作者:栢白 欄目:開發技術

本篇文章和大家了解一下C語言中pthread_exit()函數實現終止線程的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。


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

  • 線程將指定函數體中的代碼執行完后自行結束;

  • 線程執行過程中,被同一進程中的其它線程(包括主線程)強制終止;

  • 線程執行過程中,遇到 pthread_exit() 函數結束執行。

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

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

pthread_exit()函數的用法

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

void pthread_exit(void *retval);

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

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

接下來通過一個樣例,給大家演示 pthread_exit() 函數的用法(樣例一):

#include <stdio.h>
#include <pthread.h>
//線程要執行的函數,arg 用來接收線程傳遞過來的數據
void *ThreadFun(void *arg)
{
    //終止線程的執行,將“http://c.biancheng.net”返回
    pthread_exit("http://c.biancheng.net"); //返回的字符串存儲在常量區,并非當前線程的私有資源
    printf("*****************");//此語句不會被線程執行
}
int main()
{
    int res;
    //創建一個空指針
    void * thread_result;
    //定義一個表示線程的變量
    pthread_t myThread;
    res = pthread_create(&myThread, NULL, ThreadFun, NULL);
    if (res != 0) {
        printf("線程創建失敗");
        return 0;
    }
    //等待 myThread 線程執行完成,并用 thread_result 指針接收該線程的返回值
    res = pthread_join(myThread, &thread_result);
    if (res != 0) {
        printf("等待線程失敗");
    }
    printf("%s", (char*)thread_result);
    return 0;
}

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

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

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

pthread_exit() 和 return 的區別

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

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

return "http://yisu.com";

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

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

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

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

#include <stdio.h>
#include <pthread.h>
void *ThreadFun(void *arg)
{
    sleep(5);//等待一段時間
    printf("http://yisu.com\n");
}
int main()
{
    int res;
    pthread_t myThread;
    res = pthread_create(&myThread, NULL, ThreadFun, NULL);
    if (res != 0) {
        printf("線程創建失敗");
        return 0;
    }
    printf("億速云\n");
    return 0;
}
編譯、執行此程序,輸出結果為:
億速云

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

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

pthread_exit(NULL);

重新編譯、執行程序,運行結果為:

億速云
http://yisu.com

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

此外,pthread_exit() 可以自動調用線程清理程序(本質是一個由 pthread_cleanup_push() 指定的自定義函數),return 則不具備這個能力。總之在實際場景中,如果想終止某個子線程執行,強烈建議大家使用 pthread_exit() 函數。終止主線程時,return 和 pthread_exit() 函數發揮的功能不同,可以根據需要自行選擇。

以上就是C語言中pthread_exit()函數實現終止線程的方法的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 贵南县| 漾濞| 怀来县| 顺昌县| 盐城市| 宁海县| 榆社县| 邹城市| 郑州市| 南京市| 屯门区| 灵山县| 阿克陶县| 宣城市| 格尔木市| 平潭县| 饶平县| 佳木斯市| 丹寨县| 新龙县| 林口县| 定安县| 聂拉木县| 延寿县| 高州市| 榆中县| 松原市| 泰和县| 杭州市| 葫芦岛市| 杭锦后旗| 金坛市| 中西区| 成都市| 龙海市| 潞城市| 台东市| 石泉县| 罗田县| 桦川县|