国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】C語言中多線程的創(chuàng)建、退出、回收、分離

這篇具有很好參考價值的文章主要介紹了【Linux】C語言中多線程的創(chuàng)建、退出、回收、分離。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

概述

線程是輕量級的進程(LWP:light weight process),在 Linux 環(huán)境下線程的本質(zhì)仍是進程。在計算機上運行的程序是一組指令及指令參數(shù)的組合,指令按照既定的邏輯控制計算機運行。操作系統(tǒng)會以進程為單位,分配系統(tǒng)資源,可以這樣理解,進程是資源分配的最小單位,線程是操作系統(tǒng)調(diào)度執(zhí)行的最小單位。

在Linux系統(tǒng)下,線程的創(chuàng)建和管理是通過pthread庫實現(xiàn)的。pthread是POSIX線程庫,提供了創(chuàng)建、終止、同步和通信線程的函數(shù)和數(shù)據(jù)結(jié)構(gòu)。

創(chuàng)建線程

線程函數(shù)

每一個線程都有一個唯一的線程 ID,ID 類型為 pthread_t,這個 ID 是一個無符號長整形數(shù),如果想要得到當前線程的線程 ID,可以調(diào)用如下函數(shù):

pthread_t pthread_self(void);	// 返回當前線程的線程ID

在Linux系統(tǒng)下,可以使用pthread_create函數(shù)來創(chuàng)建線程。pthread_create函數(shù)的原型如下:

#include <pthread.h>

int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*), void* arg);

  • thread:指向pthread_t類型的指針,用于存儲新創(chuàng)建線程的標識符。在成功創(chuàng)建線程后,該指針將被填充為一個唯一的標識符,用于后續(xù)對線程的引用。
  • attr:指向pthread_attr_t類型的指針,用于指定線程的屬性。線程屬性對象可以控制線程的各種行為,例如線程的調(diào)度策略、棧大小、分離狀態(tài)等。如果不需要對線程屬性進行特殊設置,可以傳入NULL,使用默認屬性。
  • start_routine:指向線程函數(shù)的指針,該函數(shù)是線程的入口點。線程函數(shù)是線程的實際執(zhí)行體,當線程被創(chuàng)建時,將從該函數(shù)開始執(zhí)行。函數(shù)的返回類型必須為void*,并接受一個void*類型的參數(shù)。線程函數(shù)可以執(zhí)行任意操作,包括計算、訪問共享資源等。
  • arg:傳遞給線程函數(shù)的參數(shù),類型為void*??梢詫⑷我忸愋偷臄?shù)據(jù)傳遞給線程函數(shù),只需將其轉(zhuǎn)換為void*類型。在線程函數(shù)內(nèi)部,可以使用適當?shù)念愋娃D(zhuǎn)換將參數(shù)恢復為原始類型。

返回值:線程創(chuàng)建成功返回 0,創(chuàng)建失敗返回對應的錯誤號

在編寫多線程程序的時候,如果想要讓線程退出,但是不會導致虛擬地址空間的釋放(針對于主線程),我們就可以調(diào)用線程庫中的線程退出函數(shù),只要調(diào)用該函數(shù)當前線程就馬上退出了,并且不會影響到其他線程的正常運行,不管是在子線程或者主線程中都可以使用。

void pthread_exit(void *retval);

參數(shù) retval 是一個指向任意類型的指針,表示線程的退出狀態(tài)。線程的退出狀態(tài)可以用于與其他線程進行通信或傳遞結(jié)果。

pthread_self() 是一個 POSIX 線程庫函數(shù),用于獲取當前線程的線程 ID。

pthread_t pthread_self(void);

線程創(chuàng)建

注意:線程函數(shù)可以接受一個指向任意類型的參數(shù),并且返回一個指向任意類型的指針。
首先使用vim pthread_create.c創(chuàng)建c語言文件。
鍵入代碼:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>

void *callback(void* arg)
{
        for(int i=0;i<5;++i)
                {
                        printf("子線程:i=%d\n",i);

                }
        printf("子線程:%ld\n",pthread_self());
        return NULL;
}

int main()
{
        pthread_t tid;
        pthread_create(&tid,NULL,callback,NULL);
        for(int i=0;i<5;++i)
        {
                printf("主線程:i=%d\n",i);
        }
        printf("主線程:%ld\n",pthread_self());
        pthread_exit(NULL);
        return 0;
}

保存文件后使用g++ pthread_create.c -lpthread -o app命令進行編譯。
該命令用于編譯名為 pthread_create.c 的源代碼文件,并鏈接 pthread 庫生成可執(zhí)行文件 app。

g++:是 GNU 編譯器集合中的 C++ 編譯器。
pthread_create.c:是要編譯的源代碼文件的名稱。
-lpthread:表示鏈接 pthread 庫,這是 POSIX 線程庫。
-o app2:指定生成的可執(zhí)行文件的名稱為 app2

【Linux】C語言中多線程的創(chuàng)建、退出、回收、分離
執(zhí)行./app,結(jié)果如下所示
【Linux】C語言中多線程的創(chuàng)建、退出、回收、分離

線程回收

在線程編程中,線程回收是指等待線程執(zhí)行結(jié)束并收回相關資源。在 POSIX 線程庫中,可以使用 pthread_join 函數(shù)來實現(xiàn)線程的回收。pthread_join 函數(shù)的原型如下:

int pthread_join(pthread_t thread, void **retval);

其中,thread 參數(shù)是要回收的線程標識符,retval參數(shù)用于接收線程的返回值。函數(shù)的返回值表示回收線程的執(zhí)行狀態(tài),如果成功回收線程,則返回 0,否則返回一個非零值,表示出現(xiàn)了錯誤。

當調(diào)用 pthread_join 函數(shù)時,當前線程會被阻塞,直到指定的線程執(zhí)行結(jié)束。一旦線程執(zhí)行結(jié)束,它的資源將被回收,并可以通過 retval 參數(shù)獲取線程的返回值。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
struct persion
{
int num;
int age;
};
void *callback(void* arg)
{
        for(int i=0;i<5;++i)
                {
                        printf("子線程:i=%d\n",i);

                }
        printf("子線程:%ld\n",pthread_self());
        struct persion* t = (struct persion*)arg;
        t->num=100;
        t->age=5;
        pthread_exit(&t);
        return NULL;
}

int main()
{
        pthread_t tid;
        struct persion t;
        pthread_create(&tid,NULL,callback,&t);
        for(int i=0;i<5;++i)
        {
                printf("主線程:i=%d\n",i);
        }
        printf("主線程:%ld\n",pthread_self());
        void *ptr;
        pthread_join(tid,&ptr);
        struct persion *pt=(struct persion*)ptr;
        printf("num:%d,age:%d\n",t.num,t.age);
        pthread_exit(NULL);
        return 0;
}

pthread_join其實是個阻塞函數(shù),如果還有子線程在運行,調(diào)用該函數(shù)就會阻塞,子線程退出函數(shù)解除阻塞進行資源的回收,函數(shù)被調(diào)用一次,只能回收一個子線程,如果有多個子線程則需要循環(huán)進行回收。

ptr 用于接收子線程的返回值,pt 通過強制類型轉(zhuǎn)換指向子線程的返回值,而 t 是主線程中的一個獨立對象

結(jié)果如下所示:
【Linux】C語言中多線程的創(chuàng)建、退出、回收、分離

線程分離

線程的分離是指將線程設置為分離狀態(tài),使其在退出時自動釋放資源,不需要顯式地調(diào)用 pthread_join 函數(shù)來等待線程的結(jié)束。

在某些情況下,程序中的主線程有屬于自己的業(yè)務處理流程,如果讓主線程負責子線程的資源回收,調(diào)用 pthread_join() 只要子線程不退出主線程就會一直被阻塞,主要線程的任務也就不能被執(zhí)行了。

線程分離之后在主線程中使用 pthread_join() 就回收不到子線程資源了。

        for(int i=0;i<5;++i)
                {
                        printf("子線程:i=%d\n",i);

                }
        printf("子線程:%ld\n",pthread_self());
        struct persion* t = (struct persion*)arg;
        t->num=100;
        t->age=5;
        pthread_exit(&t);
        return NULL;
}

int main()
{
        pthread_t tid;
        struct persion t;
        pthread_create(&tid,NULL,callback,&t);
        for(int i=0;i<5;++i)
        {
                printf("主線程:i=%d\n",i);
        }
        printf("主線程:%ld\n",pthread_self());
        pthread_detach(tid);
        pthread_exit(NULL);

        return 0;
}

線程分離后,子線程執(zhí)行完畢后被系統(tǒng)內(nèi)核回收了,且主線程退出后不會影響子線程的執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-494379.html

到了這里,關于【Linux】C語言中多線程的創(chuàng)建、退出、回收、分離的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Linux系統(tǒng)編程:線程】 線程控制 -- 創(chuàng)建、終止、等待、分離 | 線程互斥與同步 | 互斥量與條件變量 | 生產(chǎn)者消費者模型 | 線程池 | STL/智能指針與線程安全 | 讀者寫者模型

    【Linux系統(tǒng)編程:線程】 線程控制 -- 創(chuàng)建、終止、等待、分離 | 線程互斥與同步 | 互斥量與條件變量 | 生產(chǎn)者消費者模型 | 線程池 | STL/智能指針與線程安全 | 讀者寫者模型

    寫在前面 本文重點: 了解線程概念,理解線程與進程區(qū)別與聯(lián)系。 學會線程控制,線程創(chuàng)建,線程終止,線程等待。 了解線程分離與線程安全。 學會線程同步。 學會使用互斥量,條件變量,posix 信號量,以及讀寫鎖。 理解基于讀寫鎖的讀者寫者問題。 一、線程概念 ??

    2024年02月04日
    瀏覽(104)
  • Linux中 socket編程中多進程/多線程TCP并發(fā)服務器模型

    一次只能處理一個客戶端的請求,等這個客戶端退出后,才能處理下一個客戶端。 缺點:循環(huán)服務器所處理的客戶端不能有耗時操作。 模型 源碼 可以同時處理多個客戶端請求 父進程 / 主線程專門用于負責連接,創(chuàng)建子進程 / 分支線程用來與客戶端交互。 模型 源碼 模型 源

    2024年02月12日
    瀏覽(23)
  • 【linux 多線程并發(fā)】線程退出自動清理函數(shù)的使用,釋放線程申請的資源,異常退出自動調(diào)用

    ? 專欄內(nèi)容 : 參天引擎內(nèi)核架構(gòu) 本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實現(xiàn)多機的數(shù)據(jù)庫節(jié)點的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術難點的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點的情況下對故障容災的支持。 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的

    2024年02月02日
    瀏覽(21)
  • Linux線程(4)——pthread_detach()自動回收線程資源

    Linux線程(4)——pthread_detach()自動回收線程資源

    分離線程???????? ????????默認情況下,當線程終止時,其它線程可以通過調(diào)用 pthread_join()獲取其返回狀態(tài)、回收線程資源,有時,程序員并不關心線程的返回狀態(tài),只是希望系統(tǒng)在線程終止時能夠自動回收線程資源并將其移除。在這種情況下,可以調(diào)用 pthread_detach

    2024年02月03日
    瀏覽(55)
  • java中多線程

    java中多線程

    進程 進程:是正在運行的程序 是系統(tǒng)進行資源分配和調(diào)用的獨立單位 每個進程都具有它自己的存儲空間和系統(tǒng)資源 線程 線程:是進程中的單個順序控制流,是一條執(zhí)行路徑 單線程:一個進程如果只有一條執(zhí)行路徑,則稱之為單線程程序 多線程:一個進程如果有多條執(zhí)行路

    2024年01月17日
    瀏覽(20)
  • 【Linux】線程分離 | 線程庫 | C++調(diào)用線程 | 線程局部存儲

    【Linux】線程分離 | 線程庫 | C++調(diào)用線程 | 線程局部存儲

    1. 為什么要線程分離? 使用 pthread_join 默認是阻塞的 ,即主線程等待 新線程退出 在這個過程中,主線程會直接卡住,就沒辦法繼續(xù)向后運行,也就什么都干不了 若主線程 想做其他事情 ,所以就提出了 線程分離的概念 默認情況下,新創(chuàng)建的線程是joinable的 即 線程默認被創(chuàng)

    2024年02月06日
    瀏覽(22)
  • Qt中多線程的使用

    Qt中多線程的使用

    在進行桌面應用程序開發(fā)的時候, 假設應用程序在某些情況下需要處理比較復雜的邏輯, 如果只有一個線程去處理,就會導致窗口卡頓,無法處理用戶的相關操作。這種情況下就需要使用多線程,其中一個線程處理窗口事件,其他線程進行邏輯運算,多個線程各司其職,不

    2024年02月11日
    瀏覽(18)
  • Qt 中多線程的使用

    在進行桌面應用程序開發(fā)的時候, 假設應用程序在某些情況下需要處理比較復雜的邏輯, 如果只有一個線程去處理,就會導致窗口卡頓,無法處理用戶的相關操作。這種情況下就需要使用多線程,其中一個線程處理窗口事件,其他線程進行邏輯運算,多個線程各司其職,不

    2024年02月03日
    瀏覽(29)
  • C#中多線程Task詳解

    C#中多線程Task詳解

    參考文章: 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 添加鏈接描述 1.1Thread方式 缺點:頻繁的創(chuàng)建和消耗比較好資源;提供操作線程的API不是馬上響應(線程是

    2024年02月04日
    瀏覽(22)
  • 【Linux C | 多線程編程】線程的連接、分離,資源銷毀情況

    【Linux C | 多線程編程】線程的連接、分離,資源銷毀情況

    ??博客主頁??:??https://blog.csdn.net/wkd_007?? ??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻?? ?發(fā)布時間?:2024-04-01 14:52:46 本文未經(jīng)允許,不得轉(zhuǎn)發(fā)?。。?記住一句話,“創(chuàng)建線程后,要么連接該線程,要么使該線程分離,否則可能導致資源無法

    2024年04月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包