您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Linux中線程屬性的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux中線程屬性的示例分析”這篇文章吧。
我們在調(diào)用pthread_create函數(shù)創(chuàng)建線程時,第二個參數(shù)(即線程屬性)都是設(shè)為NULL,即使用默認(rèn)屬性。一般情況下,使用默認(rèn)屬性已經(jīng)可以解決我們開發(fā)過程中的大多數(shù)問題。
但是,有時項目中我們對線程會有些特殊的要求,比如修改線程棧的大小,直接調(diào)用線程的庫函數(shù)無法滿足需求,在這種情況下我們可以直接對線程屬性進(jìn)行設(shè)置。
類型pthread_attr_t是一個結(jié)構(gòu)體,主要包括如下屬性:作用域(scope)、棧尺寸(stack size)、棧地址(stack address)、優(yōu)先級(priority)、分離的狀態(tài)(detached state)、調(diào)度策略和參數(shù)(scheduling policy and parameters)。
線程默認(rèn)的屬性為非綁定、非分離、缺省的堆棧、與父進(jìn)程同樣級別的優(yōu)先級。結(jié)構(gòu)體具體定義如下:
主要結(jié)構(gòu)體成員:
線程分離狀態(tài):etachstate
線程棧大小(默認(rèn)平均分配):stacksize
線程棧警戒緩沖區(qū)大小(位于棧末尾):guardsize
線程的屬性值不能直接設(shè)置,須使用相關(guān)函數(shù)進(jìn)行操作。屬性的初始化的函數(shù)為pthread_attr_init,這個函數(shù)必須在pthread_create函數(shù)之前調(diào)用。使用完畢之后需調(diào)用pthread_attr_destroy函數(shù)來釋放資源。
##線程屬性初始化
函數(shù)原型:
int pthread_attr_init(pthread_attr_t *attr);
返回值:
成功:0;失敗:錯誤號。
函數(shù)作用:初始化線程屬性;
注意:應(yīng)先初始化線程屬性,再調(diào)用pthread_create創(chuàng)建線程。
##線程屬性銷毀
函數(shù)原型:
int pthread_attr_destroy(pthread_attr_t *attr);
返回值:
成功:0;失敗:錯誤號
函數(shù)作用:銷毀線程屬性所占用的資源
##線程的分離狀態(tài)
線程的分離狀態(tài)決定一個線程最后終止的時候是以怎樣的方式回收資源。
非分離狀態(tài):線程的默認(rèn)屬性是非分離狀態(tài),這種情況下,線程運(yùn)行結(jié)束后,只有當(dāng)其它線程調(diào)用pthread_join()函數(shù)去回收它時,創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。
分離狀態(tài):線程如果設(shè)置為分離狀態(tài),則它將主動與主控線程脫離關(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:指向一個線程屬性的指針
detachstate:線程分離狀態(tài)
PTHREAD_CREATE_DETACHED(分離線程)
PTHREAD _CREATE_JOINABLE(非分離線程)
##線程的棧地址
POSIX.1定義了兩個常量_POSIX_THREAD_ATTR_STACKADDR 和_POSIX_THREAD_ATTR_STACKSIZE檢測系統(tǒng)是否支持棧屬性。也可以給sysconf函數(shù)傳遞_SC_THREAD_ATTR_STACKADDR或 _SC_THREAD_ATTR_STACKSIZE來進(jìn)行檢測。
當(dāng)進(jìn)程棧地址空間不夠用時,指定新建線程使用由malloc分配的空間作為自己的??臻g。通過pthread_attr_setstack和pthread_attr_getstack兩個函數(shù)分別設(shè)置和獲取線程的棧地址。
設(shè)置線程的棧地址:
int pthread_attr_setstack(pthread_attr_t attr, void stackaddr, size_t stacksize);
成功:0;失?。哄e誤號
獲取線程的棧地址:
int pthread_attr_getstack(pthread_attr_t attr, void **stackaddr, size_t stacksize);
成功:0;失?。哄e誤號
參數(shù):attr:指向一個線程屬性的指針
stackaddr:返回獲取的棧地址
stacksize:返回獲取的棧大小
##線程的棧大小
當(dāng)系統(tǒng)中有很多線程時,可能需要減小每個線程棧的默認(rèn)大小,防止進(jìn)程的地址空間不夠用。當(dāng)線程調(diào)用的函數(shù)會分配很大的局部變量或者函數(shù)調(diào)用層次很深時,可能需要增大線程棧的默認(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誤號
獲取線程棧大小:
int pthread_attr_getstacksize(pthread_attr_t attr, size_t stacksize);
成功:0;
失?。哄e誤號
參數(shù):attr:指向一個線程屬性的指針
stacksize:返回線程的堆棧大小
#include <stdio.h> #include <pthread.h>#include <string.h> #include <stdlib.h>#include <unistd.h>#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)時非分離 printf("thread join\n"); else printf("thread un known\n"); /* 設(shè)置線程分離屬性 */ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); while (1) { /* 在堆上申請內(nèi)存,指定線程棧的起始地址和大小 */ stackaddr = malloc(SIZE); if (stackaddr == NULL) { perror("malloc"); exit(1); } stacksize = SIZE; pthread_attr_setstack(&attr, stackaddr, stacksize); //借助線程的屬性,修改線程棧空間大小 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)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。