ATTENTION:附加代碼鏈接:
http://blog.sina.com.cn/s/blog_6dc9e4cf0100xcvk.html
-
線程屬性:
使用pthread_attr_t類型表示绿淋,我們需要對(duì)此結(jié)構(gòu)體進(jìn)行初始化晃危,
初始化后使用,使用后還要進(jìn)行去除初始化穆律!
pthread_attr_init:初始化
pthread_attr_destory:去除初始化#include <pthread.h> int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr); 若成功返回0,若失敗返回-1崇众。 pthread_attr_init之后滤蝠,pthread_t結(jié)構(gòu)所包含的內(nèi)容就是操作系統(tǒng)實(shí)現(xiàn) 支持的線程所有屬性的默認(rèn)值。 如果pthread_attr_init實(shí)現(xiàn)時(shí)為屬性對(duì)象分配了動(dòng)態(tài)內(nèi)存空間嘱巾, pthread_attr_destroy還會(huì)用無(wú)效的值初始化屬性對(duì)象憨琳,因此如果經(jīng) pthread_attr_destroy去除初始化之后的pthread_attr_t結(jié)構(gòu)被 pthread_create函數(shù)調(diào)用,將會(huì)導(dǎo)致其返回錯(cuò)誤旬昭。 線程屬性結(jié)構(gòu)如下: typedef struct { int detachstate; 線程的分離狀態(tài) int schedpolicy; 線程調(diào)度策略 struct sched_param schedparam; 線程的調(diào)度參數(shù) int inheritsched; 線程的繼承性 int scope; 線程的作用域 size_t guardsize; 線程棧末尾的警戒緩沖區(qū)大小 int stackaddr_set; void * stackaddr; 線程棧的位置 size_t stacksize; 線程棧的大小 }pthread_attr_t; 下面主要討論此結(jié)構(gòu)體8菝!问拘!
-
分離狀態(tài):
線程的分離狀態(tài)決定一個(gè)線程以什么樣的方式來(lái)終止自己遍略。我們已經(jīng)在前面已經(jīng)知道,在默認(rèn)情況下線程是非分離狀態(tài)的骤坐,這種情況 下绪杏,原有的線程等待創(chuàng)建的線程結(jié)束。只有當(dāng)pthread_join() 函數(shù)返回 時(shí)纽绍,創(chuàng)建的線程才算終止蕾久,才能釋放自己占用的系統(tǒng)資源。 分離線程沒(méi)有被其他的線程所等待拌夏,自己運(yùn)行結(jié)束了僧著,線程也就終止了, 馬上釋放系統(tǒng)資源障簿。 通俗的說(shuō)也就是:我們知道一般我們要等待(pthread_join)一個(gè)線程的結(jié)束霹抛, 主要是想知道它的結(jié)束狀態(tài),否則等待一般是沒(méi)有什么意義的卷谈!但是if有一 些線程的終止態(tài)我們壓根就不想知道杯拐,那么就可以使用“分離”屬性,那么我 們就無(wú)須等待管理世蔗,只要線程自己結(jié)束了端逼,自己釋放src就可以咯!這樣更 方便污淋! #include <pthread.h> int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * detachstate); int pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate); 參數(shù):attr:線程屬性變量 detachstate:分離狀態(tài)屬性 若成功返回0顶滩,若失敗返回-1。 設(shè)置的時(shí)候可以有兩種選擇: <1>.detachstate參數(shù)為:PTHREAD_CREATE_DETACHED 分離狀態(tài)啟動(dòng) <2>.detachstate參數(shù)為:PTHREAD_CREATE_JOINABLE 正常啟動(dòng)線程
-
線程的繼承性:
函數(shù)pthread_attr_setinheritsched和pthread_attr_getinheritsched分別用來(lái)設(shè) 置和得到線程的繼承性! #include <pthread.h> int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched); int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched); 參數(shù): attr 線程屬性變量 inheritsched 線程的繼承性 若成功返回0寸爆,若失敗返回-1礁鲁。 請(qǐng)注意: 繼承性決定調(diào)度的參數(shù)是從創(chuàng)建的進(jìn)程中繼承還是使用在 schedpolicy和schedparam屬性中顯式設(shè)置的調(diào)度信息盐欺。 線程沒(méi)有默認(rèn)的繼承值設(shè)置,所以如果關(guān)心線程的調(diào)度策略和參數(shù)仅醇, 只能手動(dòng)設(shè)置冗美! 可設(shè)置參數(shù): PTHREAD_INHERIT_SCHED: 新的線程繼承創(chuàng)建線程的策略和參數(shù)! PTHREAD_EXPLICIT_SCHED:新的線程繼承策略和參數(shù)來(lái)自于 schedpolicy和schedparam屬性中顯式 設(shè)置的調(diào)度信息析二!
: 下面補(bǔ)充線程調(diào)度策略和調(diào)度參數(shù):
<1>.調(diào)度策略:
函數(shù)pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分別用
來(lái)設(shè)置和得到線程的調(diào)度策略粉洼。
int pthread_attr_getschedpolicy(const pthread_attr_t *, int * policy)
int pthread_attr_setschedpolicy(pthread_attr_*, int policy)
參數(shù):
attr 線程屬性變量
policy 調(diào)度策略
若成功返回0,若失敗返回-1叶摄。
所謂調(diào)度策略也就是我們之前在OS中所學(xué)過(guò)的那些調(diào)度算法:
SCHED_FIFO :先進(jìn)先出
SCHED_RR :輪轉(zhuǎn)法
SCHED_OTHER :其他方法
SCHED_OTHER是不支持優(yōu)先級(jí)使用的,而SCHED_FIFO和SCHED_RR
支持優(yōu)先級(jí)的使用,他們分別為1和99,數(shù)值越大優(yōu)先級(jí)越高.
注意:
> 此處的SCHED_FIFO是允許被高優(yōu)先級(jí)搶占的属韧!
> 也就是有高優(yōu)先級(jí)的必須先運(yùn)行
> SCHED_RR是設(shè)置一個(gè)時(shí)間片
> 當(dāng)有SCHED_FIFO或SCHED_RR策賂的線程在一個(gè)條件變量
上等持或等持加鎖同一個(gè)互斥量時(shí),它們將以優(yōu)先級(jí)順序被喚
醒蛤吓。即宵喂,如果一個(gè)低優(yōu)先級(jí)的SCHED_FIFO線程和一個(gè)高優(yōu)先
織的SCHED_FIFO線程都在等待鎖相同的互斥且,則當(dāng)互斥量
被解鎖時(shí)会傲,高優(yōu)先級(jí)線程將總是被首先解除阻塞锅棕。
<2>.調(diào)度參數(shù):
函數(shù)pthread_attr_getschedparam 和pthread_attr_setschedparam分別
用來(lái)設(shè)置和得到線程的調(diào)度參數(shù)。
int pthread_attr_getschedparam(const pthread_attr_t *,struct
sched_param *);
int pthread_attr_setschedparam(pthread_attr_t *,const struct
sched_param *);
參數(shù):
attr 線程變量屬性
param sched_parm 結(jié)構(gòu)體
若成功返回0唆铐,若失敗返回-1哲戚。
/usr/include /bits/sched.h
struct sched_param
{
int sched_priority; //!> 參數(shù)的本質(zhì)就是優(yōu)先級(jí)
};
注意:大的權(quán)值對(duì)應(yīng)高的優(yōu)先級(jí)!
系統(tǒng)支持的最大和最小的優(yōu)先級(jí)值可以用函數(shù):
sched_get_priority_max和sched_get_priority_min得到!
#include <pthread.h>
int sched_get_priority_max( int policy );
int sched_get_priority_min( int policy );
參數(shù):max_: 系統(tǒng)支持的優(yōu)先級(jí)的最小值
min_ : 系統(tǒng)支持的優(yōu)先級(jí)的最大值
使用:max_ = sched_get_priority_max( policy );
min_ = sched_get_priority_min( policy );
注意參數(shù)是policy調(diào)用策略艾岂,也就是說(shuō)對(duì)于不同的策略的值是不
一樣的顺少!
附錄:來(lái)自
http://www.yuanma.org/data/2006/0823/article_1392.htm
policy = SCHED_OTHER
max_priority = 0
min_priority = 0
Show SCHED_FIFO of priority
max_priority = 99
min_priority = 1
Show SCHED_RR of priority
max_priority = 99
min_priority = 1
Show priority of current thread
priority = 0
-
線程的作用域:
函數(shù)pthread_attr_setscope和pthread_attr_getscope分別 用來(lái)設(shè)置和得到線程的作用域。 #include <pthread.h> int pthread_attr_getscope( const pthread_attr_t * attr, int * scope ); int pthread_attr_setscope( pthread_attr_t*, int scope ); 參數(shù): attr 線程屬性變量 scope 線程的作用域 若成功返回0王浴,若失敗返回-1脆炎。 作用域控制線程是否在進(jìn)程內(nèi)或在系統(tǒng)級(jí)上競(jìng)爭(zhēng)資源,可能的值是 PTHREAD_SCOPE_PROCESS(進(jìn)程內(nèi)競(jìng)爭(zhēng)資源) PTHREAD_SCOPE_SYSTEM (系統(tǒng)級(jí)競(jìng)爭(zhēng)資源)氓辣。
-
線程堆棧的大小
函數(shù)pthread_attr_setstackaddr和pthread_attr_getstackaddr分別用來(lái)設(shè)置和得 到線程堆棧的位置秒裕。 int pthread_attr_getstacksize(const pthread_attr_t *,size_t * stacksize); int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize); 參數(shù):attr 線程屬性變量 stacksize 堆棧大小 若成功返回0,若失敗返回-1钞啸。
-
線程堆棧的地址
#include <pthread.h> int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf); int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr); 參數(shù):attr 線程屬性變量 stackaddr 堆棧地址 若成功返回0几蜻,若失敗返回-1。 注意:pthread_attr_getstackaddr已經(jīng)過(guò)期体斩,現(xiàn)在使用的是:pthread_attr_getstack
-
警戒緩沖區(qū)
函數(shù)pthread_attr_getguardsize和pthread_attr_setguardsize分別用來(lái)設(shè)置和得 到線程棧末尾的警戒緩沖區(qū)大小梭稚。 #include <pthread.h> int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize); int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize); 若成功返回0,若失敗返回-1絮吵。 值得注意: 線程屬性guardsize控制著線程棧末尾之后以避免棧溢出的擴(kuò)展內(nèi)存 大小弧烤。這個(gè)屬性默認(rèn)設(shè)置為PAGESIZE個(gè)字節(jié)〉徘茫可以把guardsize線 程屬性設(shè)為0暇昂,從而不允許屬性的這種特征行為發(fā)生:在這種情況 下不會(huì)提供警戒緩存區(qū)莺戒。同樣地,如果對(duì)線程屬性stackaddr作了 修改急波,系統(tǒng)就會(huì)認(rèn)為我們會(huì)自己管理?xiàng)4硬⑹咕錀>彌_區(qū)機(jī)制無(wú) 效,等同于把guardsize線程屬性設(shè)為0幔崖。