多線程編程
C語(yǔ)言使用pthread_create()函數(shù)完成多線程的創(chuàng)建序六,pthread_create()函數(shù)共有四個(gè)參數(shù)。這四個(gè)參數(shù)分別為:
1. pthread_t *
第一個(gè) 參數(shù)負(fù)責(zé)向調(diào)用者傳遞子線程的線程號(hào)
2. const pthread_attr_t *
第二這個(gè)參數(shù)負(fù)責(zé)控制線程的各種屬性蒙具,這也是線程在創(chuàng)建的時(shí)候,最為復(fù)雜的一個(gè)參數(shù)朽肥。下面是這個(gè)結(jié)構(gòu)體的定義:
線程屬性結(jié)構(gòu)如下:
typedef struct
{
int detachstate; //線程的分離狀態(tài)
int schedpolicy; //線程調(diào)度策略
structsched_param schedparam; //線程的調(diào)度參數(shù)
int inheritsched; //線程的繼承性
int scope; //線程的作用域
size_t guardsize; //線程棧末尾的警戒緩沖區(qū)大小
int stackaddr_set; //線程堆棧的地址集
void* stackaddr; //線程棧的位置
size_t stacksize; //線程棧的大小
}pthread_attr_t;
2.1 detachstate
在結(jié)構(gòu)體中的第一個(gè)參數(shù)detachstate說(shuō)明了線程的分離狀態(tài)禁筏。
PTHREAD_CREATE_DETACHED分離狀態(tài):父線程在創(chuàng)建子線程之后,,父線程不會(huì)去等待子線程結(jié)束再去運(yùn)行自己接下來(lái)的程序衡招;
PTHREAD_CREATE_JOINABLE狀態(tài):父線程會(huì)等待子線程運(yùn)行結(jié)束篱昔,才繼續(xù)運(yùn)行接下來(lái)的程序。
注意的是如果當(dāng)線程一旦處于PTHREAD_CREATE_DETACHED狀態(tài)始腾,那么線程的狀態(tài)就無(wú)法再被修改了州刽。線程創(chuàng)建時(shí)默認(rèn)設(shè)置為PTHREAD_CREATE_JOINABLE狀態(tài)
這個(gè)參數(shù)通過(guò)下面的兩個(gè)函數(shù)進(jìn)行設(shè)置或者讀取
讀取線程分離狀態(tài):int pthread_attr_getdetachstate(const pthread_attr_t *attr,int detachstate);
設(shè)置線程分離狀態(tài):int pthread_attr_setdetachstate(pthread_attr_t *attr,intdetachstate);
線程的分離狀態(tài)也可以在線程創(chuàng)建之后再去設(shè)置:
pthread_detach()
2.2 schedpolicy
schedpolicy說(shuō)明的是線程的調(diào)度策略,這個(gè)值可以分別被設(shè)置為:
SCHED_FIFO:先進(jìn)先出
SCHED_RR:輪轉(zhuǎn)法
SCHED_OTHER:其他方法
這個(gè)參數(shù)可以通過(guò)下面的函數(shù)操作:
讀壤思:int pthread_attr_getschedpolicy(const pthread_attr_t*attr,int *policy);
設(shè)置:int pthread_attr_setschedpolicy(pthread_attr_t *attr,intpolicy);
2.3 schedparam
schedparam參數(shù)實(shí)際上設(shè)置的是線程的優(yōu)先級(jí)穗椅。這個(gè)參數(shù)僅當(dāng)調(diào)度策略為實(shí)時(shí)(即SCHED_RR或SCHED_FIFO)時(shí)才有效
這個(gè)參數(shù)可以通過(guò)下面的函數(shù)操作:
讀取:int pthread_attr_getschedparam(const pthread_attr_t*attr,struct sched_param *param);
設(shè)置:int pthread_attr_setschedparam(pthread_attr_t *attr,conststruct sched_param *param);
線程運(yùn)行時(shí)允許對(duì)這個(gè)值進(jìn)行修改:
pthread_setschedparam()
2.4 inheritsched
這個(gè)參數(shù)設(shè)置線程的調(diào)度參數(shù)是拷貝父線程的線程調(diào)度參數(shù)奶栖,還是上面的兩個(gè)參數(shù)schedpolicy和schedparam屬性進(jìn)行設(shè)置匹表。
該參數(shù)可以被設(shè)為:
PTHREAD_INHERIT_SCHED:表示新現(xiàn)成將繼承創(chuàng)建線程的調(diào)度策略和參數(shù))
PTHREAD_EXPLICIT_SCHED:表示使用在schedpolicy和schedparam屬性中顯式設(shè)置的調(diào)度策略和參數(shù)
這個(gè)參數(shù)通過(guò)下面的兩個(gè)函數(shù)進(jìn)行設(shè)置或者讀取
讀让趴馈:int pthread_attr_getinheritsched(const pthread_attr_t*attr,int *inheritsched);
設(shè)置:int pthread_attr_setinheritsched(pthread_attr_t *attr,intinheritsched);
2.5 scope
scope參數(shù)設(shè)置的是線程優(yōu)先級(jí)的使用范圍。
PTHREAD_SCOPE_PROCESS 進(jìn)程級(jí)競(jìng)爭(zhēng)資源
PTHREAD_SCOPE_SYSTEM 系統(tǒng)級(jí)競(jìng)爭(zhēng)資源
該參數(shù)可以由下面的函數(shù)操作
讀壬:ⅰ:int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
設(shè)置:int pthread_attr_setscope(pthread_attr_t *attr, int scope);
2.6 stackaddr
這個(gè)參數(shù)是線程棧的起始地址拜鹤,這個(gè)參數(shù)只有在線程棧由自己創(chuàng)建時(shí)框冀,才需要設(shè)置流椒。當(dāng)線程棧由用戶(hù)直接創(chuàng)建,而不是通過(guò)系統(tǒng)創(chuàng)建時(shí)明也,線程棧的大小和位置都可以進(jìn)行修改宣虾,但是用戶(hù)程序需要完成對(duì)線程棧空間的釋放温数。在設(shè)置該參數(shù)之后绣硝,guardsize警戒棧緩沖區(qū)的大小就變?yōu)?,為了防止棧溢出就需要對(duì)線程棧的境界棧緩沖區(qū)進(jìn)行設(shè)置撑刺。
該參數(shù)之前由單獨(dú)的函數(shù)進(jìn)行設(shè)置鹉胖,但是目前已經(jīng)被下面的函數(shù)取代:
讀取:int pthread_attr_getstack(const pthread_attr_t *attr, void *stackaddr, size_t *stacksize);
設(shè)置:int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
2.7 guardsize
這個(gè)參數(shù)設(shè)置警戒棧緩沖區(qū)的大小够傍。警戒棧緩沖區(qū)可以保護(hù)程序甫菠,防止棧溢出對(duì)數(shù)據(jù)造成破壞。
這個(gè)參數(shù)可以由下面的函數(shù)進(jìn)行操作
讀让嵬汀:int pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize);
設(shè)置:int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
2.8 stacksize
stacksize參數(shù)在線程創(chuàng)建之前創(chuàng)建寂诱,用來(lái)修改創(chuàng)建的線程棧的大小,但是最小不能低于PTHREAD_STACK_MIN (16384) bytes安聘,即16k內(nèi)存大小痰洒,也就是4個(gè)內(nèi)存頁(yè)(4個(gè)內(nèi)存頁(yè)這一點(diǎn)由內(nèi)核決定)。
該參數(shù)可以由下面的函數(shù)操作
讀仍【隆:int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
設(shè)置:int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
3. void *(*start_routine) (void *)
這個(gè)參數(shù)負(fù)責(zé)指定子線程需要允許的函數(shù)丘喻,這個(gè)參數(shù)需要的是一個(gè)函數(shù)指針。
4. void *
這個(gè)參數(shù)負(fù)責(zé)指定念颈,子線程所運(yùn)行的函數(shù)的參數(shù)值泉粉。