真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux中線程屬性的示例分析

這篇文章主要為大家展示了“Linux中線程屬性的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux中線程屬性的示例分析”這篇文章吧。

成都創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供新縣網(wǎng)站建設(shè)、新縣做網(wǎng)站、新縣網(wǎng)站設(shè)計(jì)、新縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、新縣企業(yè)網(wǎng)站模板建站服務(wù),十載新縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

我們?cè)谡{(diào)用pthread_create函數(shù)創(chuàng)建線程時(shí),第二個(gè)參數(shù)(即線程屬性)都是設(shè)為NULL,即使用默認(rèn)屬性。一般情況下,使用默認(rèn)屬性已經(jīng)可以解決我們開(kāi)發(fā)過(guò)程中的大多數(shù)問(wèn)題。

但是,有時(shí)項(xiàng)目中我們對(duì)線程會(huì)有些特殊的要求,比如修改線程棧的大小,直接調(diào)用線程的庫(kù)函數(shù)無(wú)法滿足需求,在這種情況下我們可以直接對(duì)線程屬性進(jìn)行設(shè)置。

類(lèi)型pthread_attr_t是一個(gè)結(jié)構(gòu)體,主要包括如下屬性:作用域(scope)、棧尺寸(stack size)、棧地址(stack  address)、優(yōu)先級(jí)(priority)、分離的狀態(tài)(detached state)、調(diào)度策略和參數(shù)(scheduling policy and  parameters)。

線程默認(rèn)的屬性為非綁定、非分離、缺省的堆棧、與父進(jìn)程同樣級(jí)別的優(yōu)先級(jí)。結(jié)構(gòu)體具體定義如下:

主要結(jié)構(gòu)體成員:

  • 線程分離狀態(tài):etachstate

  • 線程棧大小(默認(rèn)平均分配):stacksize

  • 線程棧警戒緩沖區(qū)大小(位于棧末尾):guardsize

線程的屬性值不能直接設(shè)置,須使用相關(guān)函數(shù)進(jìn)行操作。屬性的初始化的函數(shù)為pthread_attr_init,這個(gè)函數(shù)必須在pthread_create函數(shù)之前調(diào)用。使用完畢之后需調(diào)用pthread_attr_destroy函數(shù)來(lái)釋放資源。

##線程屬性初始化

函數(shù)原型:

int pthread_attr_init(pthread_attr_t *attr);

返回值:

成功:0;失?。哄e(cuò)誤號(hào)。

函數(shù)作用:初始化線程屬性;

注意:應(yīng)先初始化線程屬性,再調(diào)用pthread_create創(chuàng)建線程。

##線程屬性銷(xiāo)毀

函數(shù)原型:

int pthread_attr_destroy(pthread_attr_t *attr);

返回值:

成功:0;失敗:錯(cuò)誤號(hào)

函數(shù)作用:銷(xiāo)毀線程屬性所占用的資源

##線程的分離狀態(tài)

線程的分離狀態(tài)決定一個(gè)線程最后終止的時(shí)候是以怎樣的方式回收資源。

非分離狀態(tài):線程的默認(rèn)屬性是非分離狀態(tài),這種情況下,線程運(yùn)行結(jié)束后,只有當(dāng)其它線程調(diào)用pthread_join()函數(shù)去回收它時(shí),創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。

分離狀態(tài):線程如果設(shè)置為分離狀態(tài),則它將主動(dòng)與主控線程脫離關(guān)系,當(dāng)它自己運(yùn)行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。

設(shè)置線程分離狀態(tài)的函數(shù):

設(shè)置線程屬性

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

獲取程屬性

int pthread_attr_getdetachstate(pthread_attr_t attr, int detachstate);

參數(shù):attr:指向一個(gè)線程屬性的指針

detachstate:線程分離狀態(tài)

  • PTHREAD_CREATE_DETACHED(分離線程)

  • PTHREAD _CREATE_JOINABLE(非分離線程)

##線程的棧地址

POSIX.1定義了兩個(gè)常量_POSIX_THREAD_ATTR_STACKADDR  和_POSIX_THREAD_ATTR_STACKSIZE檢測(cè)系統(tǒng)是否支持棧屬性。也可以給sysconf函數(shù)傳遞_SC_THREAD_ATTR_STACKADDR或  _SC_THREAD_ATTR_STACKSIZE來(lái)進(jìn)行檢測(cè)。

當(dāng)進(jìn)程棧地址空間不夠用時(shí),指定新建線程使用由malloc分配的空間作為自己的??臻g。通過(guò)pthread_attr_setstack和pthread_attr_getstack兩個(gè)函數(shù)分別設(shè)置和獲取線程的棧地址。

設(shè)置線程的棧地址:

int pthread_attr_setstack(pthread_attr_t attr, void stackaddr, size_t stacksize);

成功:0;失敗:錯(cuò)誤號(hào)

獲取線程的棧地址:

int pthread_attr_getstack(pthread_attr_t attr, void **stackaddr, size_t stacksize);

成功:0;失?。哄e(cuò)誤號(hào)

參數(shù):attr:指向一個(gè)線程屬性的指針

  • stackaddr:返回獲取的棧地址

  • stacksize:返回獲取的棧大小

##線程的棧大小

當(dāng)系統(tǒng)中有很多線程時(shí),可能需要減小每個(gè)線程棧的默認(rèn)大小,防止進(jìn)程的地址空間不夠用。當(dāng)線程調(diào)用的函數(shù)會(huì)分配很大的局部變量或者函數(shù)調(diào)用層次很深時(shí),可能需要增大線程棧的默認(rèn)大小。

函數(shù)pthread_attr_getstacksize和 pthread_attr_setstacksize可以設(shè)置或者獲取線程的棧大小。

設(shè)置線程棧大?。?/p>

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
  • 成功:0;

  • 失?。哄e(cuò)誤號(hào)

獲取線程棧大小:

int pthread_attr_getstacksize(pthread_attr_t attr, size_t stacksize);
  • 成功:0;

  • 失?。哄e(cuò)誤號(hào)

參數(shù):attr:指向一個(gè)線程屬性的指針

stacksize:返回線程的堆棧大小

#include  #include #include  #include #include #define SIZE 0x10000 void *th_fun(void *arg) {    while (1)          sleep(1); }int main(void){    pthread_t tid;    int err, detachstate, i = 1;     pthread_attr_t attr;    size_t stacksize;   //typedef  size_t  unsigned int     void *stackaddr;    pthread_attr_init(&attr);           pthread_attr_getstack(&attr, &stackaddr, &stacksize);    pthread_attr_getdetachstate(&attr, &detachstate);    if (detachstate == PTHREAD_CREATE_DETACHED)   //默認(rèn)是分離態(tài)         printf("thread detached\n");     else if (detachstate == PTHREAD_CREATE_JOINABLE) //默認(rèn)時(shí)非分離         printf("thread join\n");     else         printf("thread un known\n");     /* 設(shè)置線程分離屬性 */    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);    while (1) {         /* 在堆上申請(qǐng)內(nèi)存,指定線程棧的起始地址和大小 */        stackaddr = malloc(SIZE);        if (stackaddr == NULL) {             perror("malloc");             exit(1);         }        stacksize = SIZE;        pthread_attr_setstack(&attr, stackaddr, stacksize);   //借助線程的屬性,修改線程??臻g大小        err = pthread_create(&tid, &attr, th_fun, NULL);        if (err != 0) {             printf("%s\n", strerror(err));             exit(1);         }        printf("%d\n", i++);     }    pthread_attr_destroy(&attr);    return 0; }

以上是“Linux中線程屬性的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享名稱(chēng):Linux中線程屬性的示例分析
文章轉(zhuǎn)載:http://weahome.cn/article/jgdjpi.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部