[glibc-manual]34.2 線程屬性

來源:互聯網
上載者:User

34.2 線程屬性

線程具有一系列屬性;這些屬性可以線上程建立的時候指定。只需要建立並填充一個 pthread_attr_t 類型的線程屬性對象 ATTR,並將其作為第二個參數傳遞給 pthread_create 就可以指定新建立線程的屬性。如傳遞 NULL 作為第二個參數,則等價於傳遞一個所有屬性均為預設值的屬性對象。

僅當建立新線程的時候線程屬性對象才被參考。同一個線程對象可用於建立多個線程。在 pthread_create 之後修改一個線程對象並不會修改之前建立的線程的屬性。

-- 函數: int pthread_attr_init (pthread_attr_t *ATTR)
pthread_attr_init 函數將對屬性對象 ATTR 進行初始化,並將其屬性置為預設值。(下面列舉了每個屬性的預設值。)

每個屬性,ATTRNAME,可以通過函數 pthread_attr_setATTRNAME 單獨進行設定,也可以通過函數 pthread_attr_getATTRNAME 單獨擷取其值。本文隨後部分列舉了所有的屬性。

-- 函數: int pthread_attr_destroy (pthread_attr_t *ATTR)
pthread_attr_destory 銷毀一個 ATTR 指向的線程屬性對象,並釋放與其關聯的所有資源。指標 ATTR 被保留在一種未定義狀態(野指標——譯者注)因此你在未再次將其初始化之前不應該再度將其用於任何 pthread 函數中。

-- 函數: int pthread_attr_setattr (pthread_attr_t *OBJ, int VALUE)
將 OBJ 指向的屬性對象中所包含的屬性 ATTR 設定為 VALUE。本文隨後將列舉各種屬性及其可能被賦予的值。

當賦值成功時該函數將返回 0。如果 VALUE 對於被修改的 ATTR 不具有實際意義,該函數將返回錯誤碼 EINVAL。這組函數中的部分可能返回其它錯誤碼,詳見下文。

-- 函數: int pthead_attr_getattr (const pthread_attr_t *OBJ, int *VALUE)
將 OBJ 中 ATTR 當前的值存入 VALUE 指向的變數。
該組函數總返回 0。

Pthread 庫支援以下線程屬性:
detachstate
此屬性決定線程是否被建立為可等待的(賦值為 PTHREAD_CREATE_JOINABLE)或脫離的(賦值為 PTHREAD_CREATE_DETACHED)。預設為 PTHREAD_CREATE_JOINABLE。
當線程處於可等待狀態時,其它線程可以通過 pthread_join 函數等待線程退出並擷取結束代碼。部分線程資源會線上程中止後仍然保持在系統中,直到有其它線程對其調用 pthread_join 時才會被釋放。
當線程處於脫離狀態時,線程結束後所有資源會被立即釋放;同時 pthread_join 無法被用於等待線程的退出。

schedpolicy
設定該線程的調度策略:SCHED_OTHER(正常的、非即時調度策略)、SCHED_RR(即時的,迴圈制)或 SCHED_FIFO(即時的、先入先出)。預設值是 SCHED_OTHER。
即時調度策略 SCHED_RR 和 SCHED_FIFO 僅允許具有超級使用者權限的線程使用。如果一個不具有超級使用者權限的線程嘗試設定這些策略的時候, pthread_attr_setschedparam 將執行失敗並返回 ENOTSUP。
線程的調度策略可以線上程建立之後通過 pthread_setschedparam 改變。

schedparam
改變線程的調度參數(調度優先順序)。預設值為0。
當線程的調度策略為 SCHED_OTHER 時這個屬性的作用並不明顯;只有當設定調度策略為即時的 SCHED_RR 或 SCHED_FIFO 時它才會起作用。
線程調度優先順序可在建立後通過 pthread_setschedparam 修改。

inheritsched
決定新建立線程的調度策略和調度參數由 SCHEDPOLICY 和 SCHEDPARAM 決定(將此參數設定為 PTHREAD_EXPLICIT_SCHED)還是繼承自建立該線程的父線程(設定為 PTHREAD_INHERIT_SCHED)。預設值為 PTHREAD_EXPLICIT_SCHED。

scope
決定線程調度爭奪範圍。該屬性預設為 PTHREAD_SCOPE_SYSTEM,意為這些線程將與系統中所有進程爭奪 CPU 時間。需要注意的細節是,此時線程的優先順序將被用於與系統中所有其它進程的優先順序進行比較並確定效果。另外一個可能的值為 PTHREAD_SCOPE_PROCESS,意為爭奪範圍僅限於進程中的不同線程之間;此時線程的優先順序僅用於與同進程中的其它線程的優先順序進行比較,並與系統中其它進程的優先順序無關。
PTHREAD_SCOPE_PROCESS 在 LinuxThreads 實現中沒有獲得支援。如果你嘗試設定這個屬性值時,pthread_attr_setscope 會失敗並返回 ENOTSUP。(Glibc 2.3.2 with NTPL 0.60 仍然不支援此屬性——譯者注)

stacksize
改變新建立線程的棧容量。這個值確定了棧的最小體積,單位為位元組(byte)。
如果屬性值超過了系統最大棧容量,或者小於 PTHREAD_STACK_MIN,pthread_attr_setstacksize 會失敗並返回 EINVAL。

stackaddr
為新線程提供了程式管理的棧的記憶體基址。STACKADDR 與之前介紹的 stacksize 屬性一起可以用於確定新建立線程的棧。(手冊中這兩個屬性的介紹非常混亂,已經修改。——譯者注)

guardsize
改變線程棧的警戒地區的最小容積。預設值為一個記憶體分頁的大小。如果這個屬性被設定,它的值將被向上靠攏到最接近的記憶體分頁大小的整數倍。如果值為 0,則系統將不會為新線程設定警戒地區。被分配作為警戒地區的記憶體將被用於捕獲棧溢出狀況。因此,當嘗試在棧上分配體積巨大的結構體時,可能需要一個較大的警戒地區以捕獲棧溢出的可能。
如果調用者自主管理棧地區(如果 stackaddr 屬性被設定),則 guardsize 屬性將被忽略。
如果這個值的大小超過了 stacksize,pthread_attr_setguardsize 將會失敗並返回 EINVAL。

==========
譯者補記

int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param);

int pthread_getschedparam(pthread_t target_thread, int *policy, struct sched_param *param);

分別用於讀取、設定 target_thread 的調度策略和參數的函數。其中 struct sched_param 定義參考 sched_setscheduler 手冊頁:

       struct sched_param {
           ...
           int sched_priority;
           ...
       };

即其中通過 .sched_priority 成員指定調度的靜態優先順序。如前所述,SCHED_OTHER 策略下,sched_priority 靜態優先順序必須為 0,系統根據 niceness 及動態優先順序演算法確定進程調度優先順序。除 SCHED_OTHER 之外的調度策略均為即時調度策略,要求具有超級使用者權限方可設定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.