Linux编程练习 --多线程2--属性的设置
在上一篇的練習(xí)里,我們用pthread_create函數(shù)創(chuàng)建了一個線程,在這個線程中,我們使用了默認(rèn)參數(shù),即將該函數(shù)的第二個參數(shù)設(shè)為NULL。的確,對大多數(shù)程序來說,使用默認(rèn)屬性就夠了,但我們還是有必要來了解一下線程的有關(guān)屬性。
屬性設(shè)置
屬性結(jié)構(gòu)為pthread_attr_t,它同樣在頭文件/usr/include/pthread.h中定義
????? 屬性值不能直接設(shè)置,須使用相關(guān)函數(shù)進(jìn)行操作,初始化的函數(shù)為pthread_attr_init,這個函數(shù)必須在pthread_create函數(shù)之前調(diào)用。比如:
[cpp]?view plaincopy
????? 屬性對象主要包括是否綁定、是否分離、堆棧地址、堆棧大小、優(yōu)先級。默認(rèn)的屬性為非綁定、非分離、缺省1M的堆棧、與父進(jìn)程同樣級別的優(yōu)先級。
關(guān)于線程的綁定,牽涉到另外一個概念:輕進(jìn)程(LWP:Light Weight Process)。輕進(jìn)程可以理解為內(nèi)核線程,它位于用戶層和系統(tǒng)層之間。系統(tǒng)對線程資源的分配、對線程的控制是通過輕進(jìn)程來實(shí)現(xiàn)的,一個輕進(jìn)程可以控制一個或多個線程。默認(rèn)狀況下,啟動多少輕進(jìn)程、哪些輕進(jìn)程來控制哪些線程是由系統(tǒng)來控制的,這種狀況即稱為非綁定的。綁定狀況下,則顧名思義,即某個線程固定的"綁"在一個輕進(jìn)程之上。被綁定的線程具有較高的響應(yīng)速度,這是因?yàn)镃PU時(shí)間片的調(diào)度是面向輕進(jìn)程的,綁定的線程可以保證在需要的時(shí)候它總有一個輕進(jìn)程可用。通過設(shè)置被綁定的輕進(jìn)程的優(yōu)先級和調(diào)度級可以使得綁定的線程滿足諸如實(shí)時(shí)反應(yīng)之類的要求。
????? 線程的分離狀態(tài)決定一個線程以什么樣的方式來終止自己。線程的默認(rèn)屬性是非分離狀態(tài),這種情況下,原有的線程等待創(chuàng)建的線程結(jié)束。只有當(dāng)pthread_join()函數(shù)返回時(shí),創(chuàng)建的線程才算終止,才能釋放自己占用的系統(tǒng)資源。而分離線程不是這樣子的,它沒有被其他的線程所等待,自己運(yùn)行結(jié)束了,線程也就終止了,馬上釋放系統(tǒng)資源。程序員應(yīng)該根據(jù)自己的需要,選擇適當(dāng)?shù)姆蛛x狀態(tài)。設(shè)置線程分離狀態(tài)的函數(shù)為
pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。
第二個參數(shù)可選為PTHREAD_CREATE_DETACHED(分離線程)和 PTHREAD _CREATE_JOINABLE(非分離線程)。
這里要注意的一點(diǎn)是,如果設(shè)置一個線程為分離線程,而這個線程運(yùn)行又非常快,它很可能在pthread_create函數(shù)返回之前就終止了,它終止以后就可能將線程號和系統(tǒng)資源移交給其他的線程使用,這樣調(diào)用pthread_create的線程就得到了錯誤的線程號。要避免這種情況可以采取一定的同步措施,最簡單的方法之一是可以在被創(chuàng)建的線程里調(diào)用pthread_cond_timewait函數(shù),讓這個線程等待一會兒,留出足夠的時(shí)間讓函數(shù)pthread_create返回。設(shè)置一段等待時(shí)間,是在多線程編程里常用的方法。但是注意不要使用諸如wait()之類的函數(shù),它們是使整個進(jìn)程睡眠,并不能解決線程同步的問題。
另外一個可能常用的屬性是線程的優(yōu)先級,它存放在結(jié)構(gòu)sched_param中。用函數(shù)pthread_attr_getschedparam和函數(shù)pthread_attr_setschedparam進(jìn)行存放,一般說來,我們總是先取優(yōu)先級,對取得的值修改后再存放回去。
?
再看常用的幾個函數(shù):
1、pthread_attr_init
功能:??????? 對線程屬性變量的初始化。
頭文件:???? <pthread.h>
函數(shù)原型:?? int pthread_attr_init (pthread_attr_t* attr);
函數(shù)傳入值:attr:線程屬性。
函數(shù)返回值:成功: 0
??????????????? 失敗: -1
2、pthread_attr_setscope
功能:??????? 設(shè)置線程綁定屬性。
頭文件:???? <pthread.h>
函數(shù)原型:?? int pthread_attr_setscope (pthread_attr_t* attr, int scope);
函數(shù)傳入值:attr: 線程屬性。
??????????????? scope:PTHREAD_SCOPE_SYSTEM(綁定)
???????????????????????? PTHREAD_SCOPE_PROCESS(非綁定)
函數(shù)返回值得:同1。
3、pthread_attr_setdetachstate
功能:??????? 設(shè)置線程分離屬性。
頭文件:????? <phread.h>
函數(shù)原型:??? int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);
函數(shù)傳入值:attr:線程屬性。
??????????????? detachstate:PTHREAD_CREATE_DETACHED(分離)
????????????????????????????????? PTHREAD_CREATE_JOINABLE(非分離)
函數(shù)返回值得:同1。
4、pthread_attr_getschedparam
功能:?????? 得到線程優(yōu)先級。
頭文件:??? <pthread.h>
函數(shù)原型:? int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);
函數(shù)傳入值:attr:線程屬性;
??????????????? param:線程優(yōu)先級;
函數(shù)返回值:同1。
5、pthread_attr_setschedparam
功能:?????? 設(shè)置線程優(yōu)先級。
頭文件:???? <pthread.h>
函數(shù)原型:?? int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);
函數(shù)傳入值:attr:線程屬性。
???????????????? param:線程優(yōu)先級。
函數(shù)返回值:同1。
然后編寫一個程序練習(xí) :
?
[cpp]?view plaincopy
編譯:
$ gcc threadtest2.c -lpthread -o threadtest2
運(yùn)行:
$ ./threadtest2
好,運(yùn)行結(jié)果如下:
This is pthread1!
This is pthread2!
This is pthread2!
This is pthread2!
This is pthread1!
This is pthread1!
main programme exit!
?
我們可以看出和上一篇的結(jié)果是一樣的,不過這次線程一的線程函數(shù)一結(jié)束就自動釋放資源,線程二就得等到pthread_join來釋放系統(tǒng)資源
總結(jié)
以上是生活随笔為你收集整理的Linux编程练习 --多线程2--属性的设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 横置9挡大扭矩!红旗自主研发DCT 45
- 下一篇: linux进程和线程教程,Linux下查