在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下線程編程

wang123a ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-08-24 15:42 ? 次閱讀

Linux下線程編程

1.線程相關(guān)函數(shù)

?1.1創(chuàng)建線程pthread_create

??pthread_create是Unix操作系統(tǒng)(Unix、linux等)的創(chuàng)建線程的函數(shù)。
??注:編譯時(shí)需要指定鏈接庫 -lpthread
??函數(shù)原型:

#include 
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
形參: thread — 指向線程標(biāo)志符的指針類型為:pthread_t *
??attr — 設(shè)置線程屬性,默認(rèn)填NULL。類型為:const pthread_attr_t *
??void *(*start_routine) (void *) — 函數(shù)指針,現(xiàn)在運(yùn)行函數(shù)的起始地址
??arg — 運(yùn)行函數(shù)的參數(shù)。不需要填NULL ,類型為:void *
返回值: 成功返回0;失敗返回錯誤編號。
??線程創(chuàng)建成功后,attr參數(shù)用于指定線程屬性,新創(chuàng)建的線程函數(shù)形參只有一個(gè)void *形參,若需要傳入的參數(shù)不止一個(gè),則可以把需要傳入的參數(shù)保存到一個(gè)結(jié)構(gòu)體中,通過結(jié)構(gòu)體傳入。

??示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    while (1)
    {
      printf("子線程運(yùn)行中。。。\n");
      sleep(1);
    } 
}
int main()
{
    int stat;
    pthread_t pth;//線程標(biāo)志符
    pthread_create(&pth,NULL,start_routine_func,NULL);
    while(1)
    {
        printf("主線程運(yùn)行中。。。\n");
        sleep(1);
    }
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -l pthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
主線程運(yùn)行中。。。
子線程運(yùn)行中。。。
主線程運(yùn)行中。。。
子線程運(yùn)行中。。。
子線程運(yùn)行中。。。
主線程運(yùn)行中。。。

?1.2 退出線程pthread_exit

??函數(shù)原型:

void pthread_exit(void *retval);
函數(shù)功能:
??終止調(diào)用它的線程并通過形參返回一個(gè)指向某個(gè)對象的指針
形 參: void *retval — 線程需要返回的地址
返回值: 無
??注:線程結(jié)束必須釋放線程堆棧,也就是線程函數(shù)必須調(diào)用pthread_exit()結(jié)束,否則直到主進(jìn)程函數(shù)退出才釋放。

??示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    int cnt=0;
    while (1)
    {
      printf("子線程運(yùn)行中cnt=%d。。。\n",cnt);
      sleep(1);
      cnt++;
      if(cnt>=3)break;
    } 
    pthread_exit(NULL);//退出線程,釋放堆棧
    
}
int main()
{
    int stat;
    pthread_t pth;//線程標(biāo)志符
    /*創(chuàng)建子線線程*/
    if(pthread_create(&pth,NULL,start_routine_func,NULL)!=0)
    {
        printf("線程創(chuàng)建失敗\n");
        return 0;
    }
    printf("子線程ID=%lu\n",pth);
    /*等待線程退出*/
    pthread_join(pth,NULL);
    printf("線程退出成功\r\n");
    return 0;
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
子線程ID=3078433648
子線程運(yùn)行中cnt=0。。。
子線程運(yùn)行中cnt=1。。。
子線程運(yùn)行中cnt=2。。。
線程退出成功

?1.3 等待線程結(jié)束pthread_join

int pthread_join(pthread_t thread, void **retval);
函數(shù)功能:
??以阻塞方式等待thread指定線程結(jié)束,當(dāng)函數(shù)返回值,被等待線程的資源被回收。若線程已經(jīng)結(jié)束,則立即返回。并且thread指定的線程必須是joinable(結(jié)合屬性)屬性。
形 參: thread — 線程標(biāo)志符(線程ID)。線程唯一標(biāo)志,類型為:pthread_t
??retval — 用戶定義的指針,用來存儲被等待線程返回的地址
返回值: 成功返回0,失敗返回錯誤編號。

??示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    int cnt=0;
    while (1)
    {
      printf("子線程運(yùn)行中cnt=%d。。。\n",cnt);
      sleep(1);
      cnt++;
      if(cnt>=3)break;
    } 
    pthread_exit(NULL);//退出線程,釋放堆棧
    
}
int main()
{
    int stat;
    pthread_t pth;//線程標(biāo)志符
    /*創(chuàng)建子線線程*/
    if(pthread_create(&pth,NULL,start_routine_func,NULL)!=0)
    {
        printf("線程創(chuàng)建失敗\n");
        return 0;
    }
    printf("子線程ID=%lu\n",pth);
    /*等待線程退出*/
    pthread_join(pth,NULL);
    printf("線程退出成功\r\n");
    return 0;
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
子線程ID=3078433648
子線程運(yùn)行中cnt=0。。。
子線程運(yùn)行中cnt=1。。。
子線程運(yùn)行中cnt=2。。。
線程退出成功

?1.4 獲取當(dāng)前線程標(biāo)志符pthread_self

??函數(shù)原型:

pthread_t pthread_self(void);
函數(shù)功能:
??獲取線程自身ID。
形 參: 無
返回值: 返回當(dāng)前線程標(biāo)志符。pthread_t類型為unsigned long int,打印應(yīng)%lu。

??示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    printf("子線程ID=%lu運(yùn)行中。。。\n",pthread_self());
    pthread_exit(NULL);//退出線程,釋放堆棧
}
int main()
{
    int stat;
    int i=0;
    pthread_t pth;//線程標(biāo)志符
    printf("主線程ID=%lu\n",pthread_self());
    /*創(chuàng)建5個(gè)子線線程*/
    for(i=0;i<5;i++)
    {
        if(pthread_create(&pth,NULL,start_routine_func,NULL)!=0)
        {
            printf("線程創(chuàng)建失敗\n");
            return 0;
        }
        printf("子線程ID=%lu\n",pth);
    }
    /*等待線程退出*/
    pthread_join(pth,NULL);
    printf("線程退出成功\r\n");
    return 0;
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
主線程ID=3078706880
子線程ID=3078703984
子線程ID=3068214128
子線程ID=3057724272
子線程ID=3047234416
子線程ID=3036744560
子線程ID=3068214128運(yùn)行中。。。
子線程ID=3078703984運(yùn)行中。。。
子線程ID=3057724272運(yùn)行中。。。
子線程ID=3047234416運(yùn)行中。。。
子線程ID=3036744560運(yùn)行中。。。
線程退出成功

?1.5 自動清理線程資源

??函數(shù)原型:

//注冊清理函數(shù)
void pthread_cleanup_push(void (*routine)(void *),void *arg);
//釋放清理函數(shù)
void pthread_cleanup_pop(int execute);
函數(shù)功能:
??線程清除處理函數(shù),用于程序異常退出的時(shí)候做善后的資源清理。自動釋放資源。
??注:pthread_cleanup_push函數(shù)與pthread_cleanup_pop函數(shù)需要成對調(diào)用。
形 參:
??void (*routine)(void *) — 處理程序函數(shù)入口
??void *arg — 傳遞給處理函數(shù)形參
??int execute — 執(zhí)行的狀態(tài)值,0 – 不調(diào)用清理函數(shù);1 – 調(diào)用清理函數(shù)。
返回值: 無
導(dǎo)致調(diào)用清理函數(shù)條件:
??1.調(diào)用pthread_exit()函數(shù)
??2.Pthread_claenup_pop的形參為1
??注:return不會導(dǎo)致清理函數(shù)調(diào)用。

??示例:

#include 
#include 
#include 
/*線程清理函數(shù)*/
void routine_Clinen(void *arg)
{
    printf("arg=%d\n",*(int *)arg);
    free(arg);
    printf("釋放空間完成\n");
}
/*子線程函數(shù)*/
void *start_routine_func (void *arg)
{
    printf("arg=%s,線程運(yùn)行中...\n",arg);
    char *p=malloc(4);
    *p=100;
    //注冊線程清理函數(shù)
    pthread_cleanup_push(routine_Clinen,p);
    pthread_exit("子線程返回?cái)?shù)據(jù)測試!");//釋放線程堆棧
   // return 0;//return終止不會觸發(fā)線程清理函數(shù)
    //調(diào)用線程清理函數(shù)
    pthread_cleanup_pop(1);
}
int main() 
{
    /*1.創(chuàng)建線程*/
    char buff[]="線程傳入?yún)?shù)測試";
    pthread_t thread;
    if(pthread_create(&thread,NULL,start_routine_func,buff)!=0)
    {
        printf("線程創(chuàng)建失敗\n");
        return 0;
    }
    printf("線程ID=%lu\n",pthread_self());
    char *p;
    pthread_join(thread,(void **)&p);//等待線程退出
    printf("子線程返回?cái)?shù)據(jù):%s\n",p);
    printf("主線程退出\n");
    return 0;
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
arg=線程傳入?yún)?shù)測試,線程運(yùn)行中...
線程ID=3078866624
arg=100
釋放空間完成
子線程返回?cái)?shù)據(jù):子線程返回?cái)?shù)據(jù)測試!
主線程退出

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11351

    瀏覽量

    210497
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    63012
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    19763
  • 線程編程
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6141
收藏 人收藏

    評論

    相關(guān)推薦

    Linux下線程編程(2)

    線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程
    的頭像 發(fā)表于 08-24 15:48 ?1753次閱讀

    Linux開發(fā)_采用線程處理網(wǎng)絡(luò)請求

    介紹Linux下網(wǎng)絡(luò)編程線程編程,select機(jī)制,利用子線程響應(yīng)TCP服務(wù)器的請求。
    的頭像 發(fā)表于 09-17 15:21 ?907次閱讀

    Linux線程編程基礎(chǔ)知識解析

    線程是輕量級的進(jìn)程(`LWP: Light Weight Process`),在`Linux`環(huán)境下線程的本質(zhì)仍是`進(jìn)程`,進(jìn)程是資源分配的`最小單位`,線程是操作系統(tǒng)調(diào)度執(zhí)行的`最小
    發(fā)表于 07-14 16:41 ?851次閱讀
    <b class='flag-5'>Linux</b>多<b class='flag-5'>線程</b><b class='flag-5'>編程</b>基礎(chǔ)知識解析

    Linux線程編程手冊

    Linux線程編程手冊
    發(fā)表于 11-07 10:17

    嵌入式Linux線程編程

    嵌入式Linux線程編程-學(xué)習(xí)資源-華清遠(yuǎn)見清遠(yuǎn)見嵌入式學(xué)院:清遠(yuǎn)見嵌入式學(xué)院:《嵌入式應(yīng)用程序設(shè)計(jì)》——第5 章 嵌入式Linux線程
    發(fā)表于 11-05 06:54

    如何對Linux系統(tǒng)多線程進(jìn)行編程

    Linux系統(tǒng)編程第07期:多線程編程入門 6年嵌入式開發(fā)經(jīng)驗(yàn),在多家半導(dǎo)體...
    發(fā)表于 12-23 08:08

    linux線程編程課件

    電子發(fā)燒友為您提供了linux線程編程課件,希望對您學(xué)習(xí) linux 有所幫助。部分內(nèi)容如下: *1、多線程模型在單處理器模型和多處理器系
    發(fā)表于 07-10 11:58 ?0次下載

    linux線程編程開發(fā)

    本文中我們針對 Linux 上多線程編程的主要特性總結(jié)出 5 條經(jīng)驗(yàn),用以改善 Linux線程編程
    發(fā)表于 12-26 14:24 ?55次下載
    <b class='flag-5'>linux</b>多<b class='flag-5'>線程</b><b class='flag-5'>編程</b>開發(fā)

    線程編程Linux線程編程

    9.2 Linux線程編程 9.2.1 線程基本編程 這里要講的線程相關(guān)操作都是用戶空間中的
    發(fā)表于 10-18 15:55 ?3次下載

    關(guān)于Linux下多線程編程技術(shù)學(xué)習(xí)總結(jié)

    Linux下多線程編程技術(shù) 作為一個(gè)IT人員,不斷的學(xué)習(xí)和總結(jié)是我們這個(gè)職業(yè)習(xí)慣,所以我會將每個(gè)階段的學(xué)習(xí)都會通過一點(diǎn)的總結(jié)來記錄和檢測自己的學(xué)習(xí)效果,今天為大家總結(jié)了關(guān)于Linux
    發(fā)表于 04-22 03:12 ?2244次閱讀
    關(guān)于<b class='flag-5'>Linux</b>下多<b class='flag-5'>線程</b><b class='flag-5'>編程</b>技術(shù)學(xué)習(xí)總結(jié)

    Linux--線程編程

    影響??線程技術(shù)發(fā)展  Linux 2.2內(nèi)核    ?不存在真正意義上的線程  Linux 2 .4內(nèi)核    ?消除線程個(gè)數(shù)的限制,允許
    發(fā)表于 04-02 14:40 ?349次閱讀

    Linux下的多線程編程

    的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會利于理解和修改。  下面我們先來嘗試編寫一個(gè)簡單的多線程程序。2 簡單的多線程編程  
    發(fā)表于 04-02 14:43 ?641次閱讀

    Linux下線程與進(jìn)程的區(qū)別

    線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程
    的頭像 發(fā)表于 08-24 15:37 ?1912次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下線程</b>與進(jìn)程的區(qū)別

    Linux中多線程編程的知識點(diǎn)

    Hello、Hello大家好,我是木榮,今天我們繼續(xù)來聊一聊Linux中多線程編程中的重要知識點(diǎn),詳細(xì)談?wù)劧?b class='flag-5'>線程中同步和互斥機(jī)制。
    發(fā)表于 04-26 17:27 ?635次閱讀
    <b class='flag-5'>Linux</b>中多<b class='flag-5'>線程</b><b class='flag-5'>編程</b>的知識點(diǎn)

    linux線程編程實(shí)例

    linux線程
    的頭像 發(fā)表于 02-15 21:16 ?533次閱讀
    <b class='flag-5'>linux</b>多<b class='flag-5'>線程</b><b class='flag-5'>編程</b>實(shí)例
    主站蜘蛛池模板: 天天操人人干 | 亚洲jizzjizz中国妇女 | 午夜在线视频免费 | 日本免费三级网站 | 特黄特色三级在线播放 | 午夜老司机永久免费看片 | 欧美一区精品 | 中文字幕色 | 色综合久久综合欧美综合图片 | 天天做天天爱天天爽天天综合 | 亚洲狠狠狠一区二区三区 | 在线看黄网站 | 天天爽视频 | 亚洲一级毛片免费看 | 老色99久久九九精品尤物 | 最刺激黄a大片免费观看 | 黄色美女网站免费看 | 欧美黄一片 | 手机看片1024在线观看 | 免费一级毛片在级播放 | 国产91久久最新观看地址 | 四虎黄色 | 天天爱天天干天天 | 小雪被撑暴黑人黑人与亚洲女人 | 欧美日韩国产一区 | 国产精品毛片久久久久久久 | 免费看黄色一级毛片 | 国产婷婷综合在线精品尤物 | 午夜精品久久久久久久四虎 | 在线观看免费观看 | abc119影院成人免费看 | 天堂网www在线资源 天堂网www在线资源链接 | 国产成都一二三四区 | 免费国内精品久久久久影院 | 亚洲卡一卡2卡三卡4卡国色 | 亚洲三级视频在线观看 | 新版天堂中文资源8在线 | 国产久热精品 | 操日韩| 日本亚洲天堂网 | 四虎永久在线精品免费观看地址 |