Linux執行緒屬性

2021-06-24 18:01:49 字數 3323 閱讀 3085

執行緒屬性識別符號:pthread_attr_t 包含在 pthread.h 標頭檔案中。

typedef struct

pthread_attr_t;

屬性值不能直接設定,須使用相關函式進行操作,初始化的函式為pthread_attr_init,這個函式必須在pthread_create函式之前呼叫。之後須用pthread_attr_destroy函式來釋放資源。執行緒屬性主要包括如下屬性:作用域(scope)、棧尺寸(stack size)、棧位址(stack address)、優先順序(priority)、分離的狀態(detached state)、排程策略和引數(scheduling policy and parameters)。預設的屬性為非繫結、非分離、預設1m的堆疊、與父程序同樣級別的優先順序。

作用域屬性描述特定執行緒將與哪些執行緒競爭資源。執行緒可以在兩種競爭域內競爭資源:

程序域(process scope):與同一程序內的其他執行緒。

系統域(system scope):與系統中的所有執行緒。乙個具有系統域的執行緒將與整個系統中所有具有系統域的執行緒按照優先順序競爭處理器資源,進行排程。

solaris系統,實際上,從 solaris 9 發行版開始,系統就不再區分這兩個範圍。

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

非繫結狀態

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

繫結狀態

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

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

非分離狀態

執行緒的預設屬性是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當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()之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。

新執行緒的優先順序為預設為0。

新執行緒不繼承父執行緒排程優先順序(pthread_explicit_sched)

僅當排程策略為實時(即sched_rr或sched_fifo)時才有效,並可以在執行時通過pthread_setschedparam()函式來改變,預設為0。

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

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

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

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

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

函式pthread_attr_getstacksize和 pthread_attr_setstacksize提供設定。

當棧指標進入這段保護區時,系統會發出錯誤,通常是傳送訊號給執行緒。

該屬性預設值是pagesize大小,該屬性被設定時,系統會自動將該屬性大小補齊為頁大小的整數倍。

當改變棧位址屬性時,棧保護區大小通常清零。

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

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

sched_fifo

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

sched_rr

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

應用程式使用 pthread_setconcurrency() 通知系統其所需的併發級別。

linux 執行緒 執行緒屬性

typedef struct pthread attr t 這個結構只是為了說明 實際結構具體系統而定 雖然如此我們並不用擔心因為 屬性值不能直接設定,須使用相關函式進行操作 int pthread attr init pthread attr t attr 初始化執行緒屬性 int pthread...

linux執行緒 2 執行緒屬性

執行緒屬性由資料結構pthread attr t結構表示,其定義如下所示 typedef struct pthread attr t 這個結構體在使用過程中由pthread attr init和pthread attr destory負責資料的初始化和銷毀 schepolicy 表示執行緒被排程的策...

Linux執行緒屬性總結

執行緒屬性識別符號 pthread attr t 包含在 pthread.h 標頭檔案中。c view plain copy 執行緒屬性結構如下 typedef struct pthread attr t 屬性值不能直接設定,須使用相關函式進行操作,初始化的函式為pthread attr init,...