C多執行緒程式設計 執行緒的屬性

2021-09-25 21:21:20 字數 4196 閱讀 7693

3、執行緒的分離狀態

4、執行緒的優先順序

5、執行緒的棧位址

6、執行緒棧大小

7、執行緒的棧保護區大小

8、執行緒的排程策略

1、一般使用pthread_create函式建立乙個執行緒,使用預設引數,即將該函式的第二個引數設為null,對大多數程式來說,使用預設屬性就夠了,但我們還是有必要來了解一下執行緒的有關屬性。

2、屬性值不能直接設定,須使用相關函式進行操作,初始化的函式為pthread_attr_init,這個函式必須在pthread_create函式之前呼叫。之後須用pthread_attr_destroy函式來釋放資源。屬性物件主要包括

是否繫結

是否分離

堆疊位址

堆疊大小

優先順序預設的屬性為非繫結、非分離、預設1m的堆疊、與父程序同樣級別的優先順序。

輕程序(lwp:light weight process)

關於執行緒的繫結,牽涉到另外乙個概念:輕程序(lwp:light weight process):輕程序可以理解為核心執行緒,它位於使用者層和系統層之間。系統對執行緒資源的分配、對執行緒的控制是通過輕程序來實現的,乙個輕程序可以控制乙個或多個執行緒。

非繫結狀態

預設狀況下,啟動多少輕程序、哪些輕程序來控制哪些執行緒是由系統來控制的,這種狀況即稱為非繫結的。

繫結狀態

繫結狀態

顧名思義,即某個執行緒固定的"綁"在乙個輕程序之上。被繫結的執行緒具有較高的響應速度,這是因為cpu時間片的排程是面向輕程序的,繫結的執行緒可以保證在需要的時候它總有乙個輕程序可用。通過設定被繫結的輕程序的優先順序和排程級可以使得繫結的執行緒滿足諸如實時反應之類的要求。

應用設定執行緒繫結狀態的函式為pthread_attr_setscope,它有兩個引數,第乙個是指向屬性結構的指標,第二個是繫結型別,它有兩個取值:pthread_scope_system(繫結的)和pthread_scope_process(非繫結的)。下面的**即建立了乙個繫結的執行緒。

#include pthread_attr_t attr; pthread_t tid; /*初始化屬性值,均設為預設值*/

pthread_attr_init(&attr);

pthread_attr_setscope(&attr, pthread_scope_system);

pthread_create(&tid, &attr, (void *) my_function, null);

pthread_attr_destroy(&attr);

幾個注意點:

1、屬性物件必須初始化,否則屬性不能生效,建立執行緒時將返回錯誤

2、屬性物件被銷毀,並不影響執行緒的屬性

3、pthread_attr_init是初始化乙個執行緒物件的屬性,需要用pthread_attr_destroy對其去除初始化

4、int pthread_attr_init(pthread_attr_t *attr);

返回0,表示函式初始化物件成功。失敗時返回乙個錯誤**。

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。

非分離狀態

執行緒的預設屬性是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread_join()函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。

分離狀態

分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。應該根據自己的需要,選擇適當的分離狀態。

執行緒分離狀態的函式:

pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)

第二個引數可選為:

pthread_create_detached(分離執行緒)

pthread _create_joinable(非分離執行緒)注意

問題:

這裡要注意的一點是,如果設定乙個執行緒為分離執行緒,而這個執行緒執行又非常快,它很可能在pthread_create函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這樣呼叫pthread_create的執行緒就得到了錯誤的執行緒號。

解決手段:

要避免這種情況可以採取一定的同步措施,最簡單的方法之一是可以在被建立的執行緒裡呼叫pthread_cond_timewait函式,讓這個執行緒等待一會兒,留出足夠的時間讓函式pthread_create返回。設定一段等待時間,是在多執行緒程式設計裡常用的方法。但是注意不要使用諸如wait()之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。

相關函式

執行緒的優先順序存放在結構sched_param中(預設為0)。用函式

pthread_attr_getschedparam

pthread_attr_setschedparam

進行存放,一般說來,我們總是先取優先順序,對取得的值修改後再存放回去。

舉例

#include #include pthread_attr_t attr;

pthread_t tid;

sched_param param;

int newprio=20;

pthread_attr_init(&attr);

pthread_attr_getschedparam(&attr, ¶m);

param.sched_priority=newprio;

pthread_attr_setschedparam(&attr, ¶m);

pthread_create(&tid, &attr, (void *)myfunction, myarg);

1、posix.1定義了兩個常量_posix_thread_attr_stackaddr 和_posix_thread_attr_stacksize檢測系統是否支援棧屬性。

2、也可以給sysconf函式傳遞_sc_thread_attr_stackaddr或 _sc_thread_attr_stacksize來進行檢測。

3、當程序棧位址空間不夠用時,指定新建執行緒使用由malloc分配的空間作為自己的棧空間。通過pthread_attr_setstackaddr和pthread_attr_getstackaddr兩個函式分別設定和獲取執行緒的棧位址。傳給pthread_attr_setstackaddr函式的位址是緩衝區的低位址(不一定是棧的開始位址,棧可能從高位址往低位址增長)。

1、當系統中有很多執行緒時,可能需要減小每個執行緒棧的預設大小,防止程序的位址空間不夠用

2、當執行緒呼叫的函式會分配很大的區域性變數或者函式呼叫層次很深時,可能需要增大執行緒棧的預設大小。

3、函式pthread_attr_getstacksize和 pthread_attr_setstacksize提供設定。

posix標準指定了三種排程策略:先入先出策略 (sched_fifo)、迴圈策略 (sched_rr) 和自定義策略 (sched_other)。sched_fifo 是基於佇列的排程程式,對於每個優先順序都會使用不同的佇列。sched_rr 與 fifo 相似,不同的是前者的每個執行緒都有乙個執行時間配額。sched_fifo 和 sched_rr 是對 posix realtime 的擴充套件。sched_other 是預設的排程策略。

1、新執行緒預設使用 sched_other 排程策略。執行緒一旦開始執行,直到被搶占或者直到執行緒阻塞或停止為止。

2、sched_fifo

如果呼叫程序具有有效的使用者 id 0,則爭用範圍為系統 (pthread_scope_system) 的先入先出線程屬於實時 (rt) 排程類。如果這些執行緒未被優先順序更高的執行緒搶占,則會繼續處理該執行緒,直到該執行緒放棄或阻塞為止。對於具有程序爭用範圍 (pthread_scope_process)) 的執行緒或其呼叫程序沒有有效使用者 id 0 的執行緒,請使用 sched_fifo,sched_fifo 基於 ts 排程類。

3、sched_rr

如果呼叫程序具有有效的使用者 id 0,則爭用範圍為系統 (pthread_scope_system)) 的迴圈執行緒屬於實時 (rt) 排程類。如果這些執行緒未被優先順序更高的執行緒搶占,並且這些執行緒沒有放棄或阻塞,則在系統確定的時間段內將一直執行這些執行緒。對於具有程序爭用範圍 (pthread_scope_process) 的執行緒,請使用 sched_rr(基於 ts 排程類)。此外,這些執行緒的呼叫程序沒有有效的使用者 id 0。

多執行緒程式設計 執行緒屬性之執行緒的狀態

在任何時間點上,執行緒都是可結合的 joinable 或者分離的 detached 由上可知,執行緒的分離狀態決定了決定了執行緒以何種方式終結自己。預設情況下,執行緒是結合狀態,只有當主線程中的pthread join 函式返回時,該執行緒的資源才被 此時,才能人為該執行緒終止了。如果執行緒是分離狀...

Linux多執行緒程式設計(二) 執行緒屬性

pthread介面允許我們通過設定每個物件關聯的不同屬性來細調執行緒的行為。include int pthread attr init pthread attr t attr int pthread attr destroy pthread attr t attr 兩個函式的返回值 若成功,返回0 ...

C 多執行緒程式設計

一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...