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

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

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

Linux下線程編程(2)

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

Linux下線程編程(2)

線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個單一順序的控制流,一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。在Unix System V及SunOS中也被稱為輕量進(jìn)程(lightweight processes),但輕量進(jìn)程更多指內(nèi)核線程(kernel thread),而把用戶線程(user thread)稱為線程。

?1.6 線程取消函數(shù)pthread_cancel

int pthread_cancel(pthread_t thread);
函數(shù)功能:
??取消同一進(jìn)程中的其他線程。
形 參:
??pthread_t thread — 線程描述符
返回值: 0 — 成功,其他值 — 失敗

??示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    int data=*(int *)arg;
    while(1)
    {
        printf("data=%d\n",data);
        sleep(1);
        data++;
    }
}
int main()
{
    int data=10;
    pthread_t pth_id;
    if(pthread_create(&pth_id,NULL,start_routine_func,&data)!=0)
    {
        printf("線程創(chuàng)建失敗\n");
        return 0;
    }
    printf("子線程ID:%lu\n",pth_id);
    while(1)
    {
        sleep(1);
        printf("主線程運(yùn)行中data=%d\n",data);
        data++;
        if(data==15)
        {
            pthread_cancel(pth_id);//取消子線程
        }
    }
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
子線程ID:3079162736
data=10
主線程運(yùn)行中data=10
data=11
主線程運(yùn)行中data=11
data=12
主線程運(yùn)行中data=12
data=13
主線程運(yùn)行中data=13
data=14
主線程運(yùn)行中data=14
主線程運(yùn)行中data=15
主線程運(yùn)行中data=16
主線程運(yùn)行中data=17

1.7 線程分離屬性pthread_detach

創(chuàng)建一個線程默認(rèn)的狀態(tài)是joinable(結(jié)合屬性),如果一個線程結(jié)束但沒有調(diào)用pthread_join,則它的狀態(tài)類似于進(jìn)程中的zombie process(僵尸進(jìn)程),即還有一部分資源沒有被回收(退出狀態(tài)碼),所以創(chuàng)建線程時應(yīng)該使用函數(shù)pthread_join來等待線程運(yùn)行結(jié)束,并可得到線程的退出代碼,回收其資源(類似進(jìn)程中的wait、waitpid)。但是調(diào)用pthread_join(pthread_id)函數(shù)后,如果該線程沒有運(yùn)行結(jié)束,調(diào)用者會被阻塞,有些情況下我們并不希望如此。 pthread_detach函數(shù)可以將該線程狀態(tài)設(shè)置為detached(分離狀態(tài)),則該線程運(yùn)行結(jié)束后自動會釋放所有資源。

??函數(shù)原型:

int pthread_detach(pthread_t thread);
形 參:
??pthread_t thread — 線程標(biāo)志符
返回值: 0 — 成功,其它值 – 失敗

??示例:

#include 
#include 
#include 
void *start_routine_func(void *arg)
{
    int data=*(int *)arg;
    while(1)
    {
        printf("data=%d\n",data);
        sleep(1);
        data++;
    }
}
int main()
{
    int data=10;
    pthread_t pth_id;
    if(pthread_create(&pth_id,NULL,start_routine_func,&data)!=0)
    {
        printf("線程創(chuàng)建失敗\n");
        return 0;
    }
    printf("子線程ID:%lu\n",pth_id);
    //設(shè)置分離屬性
    pthread_detach(pth_id);
    //等待子線程退出
    pthread_join(pth_id,NULL);//未設(shè)置分離屬性則會阻塞主線程
    while(1)
    {
        sleep(1);
        printf("主線程運(yùn)行中...\n");
    }
    return 0;
}
[xsw@xsw 系統(tǒng)編程]$ gcc pthread.c -lpthread
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
子線程ID:3078335344
data=10

主線程運(yùn)行中...
data=11
主線程運(yùn)行中...
data=12
主線程運(yùn)行中...
data=13
主線程運(yùn)行中...
data=14
主線程運(yùn)行中...
data=15

1.8 設(shè)置線程??臻g

??查看線程堆??臻g:

[wbyq@wbyq ~]$ ulimit -s
8192

??8192單位是KB,也就是默認(rèn)??臻g大小為8M
??通過命令ulimit -a查看線程棧空間詳細(xì)信息

[wbyq@wbyq ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15407
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15407
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

??通過命令ulimit -s <棧空間大小>

[wbyq@wbyq ~]$ ulimit -s 10240
[wbyq@wbyq ~]$ ulimit -s 
10240

??每個線程的??臻g都是獨(dú)立的,如果堆??臻g溢出程序會出現(xiàn)段錯誤。如果一個進(jìn)程有10個線程,那么分配的棧空間大小為10*<每個線程??臻g大小>

??示例:

#include 
int main()
{
    char buff[12*1024*1024+1]="hello,world\n";
    printf("buff=%s,%d",buff,sizeof(buff));
    return 0;
}
[xsw@xsw 系統(tǒng)編程]$ ./a.out 
段錯誤 (core dumped)

?1.9 通過函數(shù)設(shè)置和查詢線程??臻g

#include 
#include 
#include 
int main()
{
    /*查看線程棧空間最小值*/
    printf("STACK_MIN:%d\n",PTHREAD_STACK_MIN);//16384byte--16kb
    pthread_attr_t attr;
    size_t ret,stack_size;
    ret=pthread_attr_init(&attr);//初始化線程屬性
    if(ret!=0)
    {
        printf("初始化失敗\n");
        return 0;
    }
    /*獲取線程棧空間*/
    ret=pthread_attr_getstacksize(&attr,&stack_size);
    printf("線程??臻g:%ld kb\n",stack_size/1024);
    /*設(shè)置線程棧空間*/
    stack_size=8*1024*1024;//8M
    pthread_attr_setstacksize(&attr,stack_size);
    /*獲取線程??臻g*/
    ret=pthread_attr_getstacksize(&attr,&stack_size);
    printf("修改后??臻g:%ld kb\n",stack_size/1024);
}
[wbyq@wbyq ubuntu]$ gcc main.c -pthread
[wbyq@wbyq ubuntu]$ ./a.out 
STACK_MIN:16384
線程棧空間:10240 kb
修改后??臻g:8192 kb

審核編輯:湯梓紅

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

    關(guān)注

    87

    文章

    11123

    瀏覽量

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

    關(guān)注

    3

    文章

    4235

    瀏覽量

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

    關(guān)注

    0

    文章

    5

    瀏覽量

    6123
收藏 人收藏

    評論

    相關(guān)推薦

    Linux下線程編程

    Linux下線程編程
    的頭像 發(fā)表于 08-24 15:42 ?1814次閱讀

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

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

    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 ?723次閱讀
    <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 c多線程編程的4個實(shí)例分享

    Linux c多線程編程的4個實(shí)例  在主流的操作系統(tǒng)中,多任務(wù)一般都提供了進(jìn)程和線程兩種實(shí)現(xiàn)方式,進(jìn)程享有獨(dú)立的進(jìn)程空間,而線程相對于進(jìn)程
    發(fā)表于 06-09 04:35

    嵌入式Linux線程編程

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

    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ù) 作為一個IT人員,不斷的學(xué)習(xí)和總結(jié)是我們這個職業(yè)習(xí)慣,所以我會將每個階段的學(xué)習(xí)都會通過一點(diǎn)的總結(jié)來記錄和檢測自己的學(xué)習(xí)效果,今天為大家總結(jié)了關(guān)于Linux
    發(fā)表于 04-22 03:12 ?2139次閱讀
    關(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)核    ?消除
    發(fā)表于 04-02 14:40 ?268次閱讀

    Linux下的多線程編程

    的進(jìn)程可以考慮分為多個線程,成為幾個獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會利于理解和修改?! ∠旅嫖覀兿葋韲L試編寫一個簡單的多線程程序。2 簡單的多線程
    發(fā)表于 04-02 14:43 ?545次閱讀

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

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