線程屬性對象

來源:互聯網
上載者:User
索引:

1.初始化屬性對象pthread_attr_init
2.刪除屬性對象pthread_attr_destroy
3.設定分離狀態pthread_attr_setdetachstate
4.擷取分離狀態pthread_attr_getdetachstate
5.設定堆棧防護區大小pthread_attr_setguardsize
6.獲得堆棧防護區大小pthread_attr_getguardsize
7.設定域pthread_attr_setscope
8.擷取域pthread_attr_getscope
9.設定並發層級pthread_setconcurrency
10.擷取並發層級pthread_getconcurrency
11.設定調度策略pthread_attr_setschedpolicy
12.擷取調度策略pthread_attr_getschedpolicy
13.設定繼承調度策略pthread_attr_setinheritsched
14.擷取繼承調度策略pthread_attr_getinheritsched
15.設定調度參數pthread_attr_setschedparam
16.擷取調度參數pthread_attr_getschedparam
17.設定堆棧大小pthread_attr_setstacksize
18.擷取堆棧大小pthread_attr_getstacksize
19.設定堆棧基址pthread_attr_setstackaddr
20.擷取堆棧基址pthread_attr_getstackaddr

以下是本文

1.初始化屬性對象pthread_attr_init

#include <pthread.h>
int pthread_attr_init( pthread_attr_t *attr );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

初始化一個線程屬性對象,並將其屬性值置成預設值。它佔用的記憶體由線程庫分配。

屬性對象的預設值如下:

屬性 說明
scope(線程域) PTHREAD_SCOPE_PROCESS 線程是非綁定的,即不是永久的綁定在LWP上
Detachstate(分離狀態) PTHREAD_CREATE_JOINABLE 線程退出後,線程結束代碼和線程都將暫時保留
Stackaddr(堆棧地址) NULL 線程的堆棧由系統分配
Stacksize(堆棧大小) 1M bytes 線程的堆棧大小由系統決定
priority(優先順序)   線程從父線程繼承線程的優先順序
Inheritsched(繼承調度優先順序) PTHREAD_INHERIT_SCHED 線程繼承父線程的調度優先順序
schedpolicy(調度策略) SCHED_OTHER 線程根據優先順序調度,線程保持運行,直到更高優先順序的線程強佔了處理器資源,或是線程被阻塞,或是線程主動出讓運行權

2.刪除屬性對象pthread_attr_destroy

#include <pthread.h>
int pthread_attr_destroy( pthread_attr_t *attr );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

用來刪除屬性對象佔用的記憶體。調用這個函數後,相應的屬性對象無效。

3.設定分離狀態pthread_attr_setdetachstate

#include <pthread.h>
int pthread_attr_setdetachstate ( pthread_attr_t *attr, int detachstate );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定分離狀態。參數detachstate的值為:PTHREAD_CREATE_DETACHED、PTHREAD_CREATE_JOINABLE。

注意:如果沒有有效同步措施,一個剛建立的分離線程有可能在pthread_create()函數返回之前就終止了,而它的線程標識符則被另一個新線程所使用。

4.擷取分離狀態pthread_attr_getdetachstate

#include <pthread.h>
int pthread_attr_getdetachstate ( pthread_attr_t *attr, int *detachstate );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

取線程分離狀態:分離的或是非分離的。

5.設定堆棧防護區大小pthread_attr_setguardsize

#include <pthread.h>
int pthread_attr_setguardsize( pthread_attr_t *attr, size_t guardsize );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定線程屬性對象的堆棧防護區guardsize大小參數。

如果線程屬性對象的guardsize參數值為0,那麼建立線程時將不會建立堆棧保護區,如果線程屬性對象的guardsize參數值大於0,那麼使用這個線程屬性對象建立的線程將起碼有一個guardsize大小的堆棧保護區。

預設情況下,線程的堆棧保護區大小根據系統版本的不同而各不相同。

建立線程堆棧時,一般的做法是將guardsize參數的值上舍入成系統變數PAGESIZE的整數倍,來分配堆棧保護區。

儘管實際的堆棧保護區大小往往是guardsize參數的上舍入值、PAGESIZE的整數倍。但程式調用pthread_attr_getguardsize()函數來取堆棧保護區的大小時,獲得的堆棧保護區大小將是調用pthread_attr_setguardsize()函數時指定的guardsize參數值。

6.獲得堆棧防護區大小pthread_attr_getguardsize

#include <pthread.h>
int pthread_attr_getguardsize( const pthread_attr_t *attr, size_t *guardsize );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

取線程屬性對象的堆棧保護區大小。

獲得的堆棧保護區大小將是調用pthread_attr_setguardsize()函數時指定的guardsize參數值。

7.設定域pthread_attr_setscope

#include <pthread.h>
int pthread_attr_setscope( pthread_attr_t *tattr, int scope );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定域。指定將來建立的線程是綁定(PTHREAD_SCOPE_SYSTEM)的還是非綁定的(PTHREAD_SCOPE_PROCESS)。

在一個進程中可以同時有這兩種不同類型的線程。

8.擷取域pthread_attr_getscope

#include <pthread.h>
int pthread_attr_getscope( pthread_attr_t *tattr, int *scope );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

取線程的域(綁定的或是非綁定的)。

9.設定並發層級pthread_setconcurrency

#include <pthread.h>
int pthread_setconcurrency( int new_level );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定線程並發層級。

在一個進程中,可能需要多個非綁定的線程被同時啟用(即綁定到LWP上參與核心的並發調度)。預設情況下,線程庫保證有足夠多的線程處在啟用狀態下以確保進程的運行。儘管這樣可以節省系統資源,但並不一定能得到最有效並發性。

該函數允許一個代理程式更新線程庫它所需要的並行層級(即同一時刻最多可以有多少個非綁定線程處在啟用狀態下)。但只是通知系統它所需要的並發層級,系統將它作為一種提示,而不是命令。

如果參數new_level的值為0,並行層級將保持不變,就像該函數從來沒有被調用過。

10.擷取並發層級pthread_getconcurrency

#include <pthread.h>
int pthread_getconcurrency( void );
取線程並發層級。

返回原來由pthread_setconcurrency()函數設定的值。如果在這之前沒有調用過pthread_setconcurrency()函數,pthread_getconcurrency()函數將返回0,這表示由線程庫維護並發層級。

11.設定調度策略pthread_attr_setschedpolicy

#include <pthread.h>
int pthread_attr_setschedpolicy( pthread_attr_t *tattr, int policy );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定調度策略。

POSIX標準定義的調度策略有:SCHED_FIFO(先入先出)、SCHED_RR(迴圈)、SCHED_OTHER(由不同版本的POSIX線程庫定義的預設調度策略)。

12.擷取調度策略pthread_attr_getschedpolicy

#include <pthread.h>
int pthread_attr_getschedpolicy( pthread_attr_t *tattr, int *policy );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

取調度策略。

13.設定繼承調度策略pthread_attr_setinheritsched

#include <pthread.h>
int pthread_attr_setinheritsched( pthread_attr_t *tattr, int inherit );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定繼承調度策略。

如果inherit參數的值為PTHREAD_INHERIT_SCHED(預設值),那麼用這個屬性對象建立的線程都將具有父線程的調度策略(屬性對象中的調度策略參數將不起作用)。如果inherit參數的值為PTHREAD_EXPLICIT_SCHED,那麼用這個屬性對象建立線程時,線程的調度策略和父線程無關,屬性對象中的調度策略參數將起作用。

14.擷取繼承調度策略pthread_attr_getinheritsched

#include <pthread.h>
int pthread_attr_getinheritsched( pthread_attr_t *tattr, int *inherit );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

擷取繼承調度策略。

15.設定調度參數pthread_attr_setschedparam

#include <pthread.h>
int pthread_attr_setschedparam( pthread_attr_t *tattr, const struct sched_param *param );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定調度參數。

屬性對象的調度參數定義在param結構中;在這個結構中只定義了優先順序priority成員。新建立線程的優先順序由屬性對象中param結構的priority參數指定。

有兩種方式可以修改線程的優先順序。你可以在建立子線程前設定屬性對象的優先順序參數;也可以先修改父線程的優先順序,然後建立子線程。

sched_param結構中有可能存放著其他一些調度資訊。所以在修改線程屬性對象的調度參數前先取現有的調度參數是良好的習慣,一段合理的代碼應該是這樣的:先取線程屬性對象中現有的調度參數,對取出的調度參數進行操作,再用修改過的調度參數重設線程屬性對象。

16.擷取調度參數pthread_attr_getschedparam

#include <pthread.h>
int pthread_attr_getschedparam( pthread_attr_t *tattr, const struct sched_param *param );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

擷取調度參數。

17.設定堆棧大小pthread_attr_setstacksize

#include <pthread.h>
int pthread_attr_setstacksize( pthread_attr_t *tattr, int size );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定堆棧大小。

參數size表示線程所需堆棧的大小。如果size的值為0。系統使用預設大小。在大多數情況下,預設值是最合適的。堆棧的大小不能小於系統定義的最小堆棧容量。

PTHREAD_STACK_MIN是啟動一個線程所必須的最小堆棧大小。這當中還不包括執行這個線程中代碼所必須的堆棧。

屬性對象的stacksize定義了系統為線程分配的堆棧的大小(位元組多少)。

18.擷取堆棧大小pthread_attr_getstacksize

#include <pthread.h>
int pthread_attr_getstacksize( pthread_attr_t *tattr, size_t *size );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

返回由pthread_attr_setstacksize()函數設定的線程堆棧大小。

19.設定堆棧基址pthread_attr_setstackaddr

#include <pthread.h>
int pthread_attr_setstackaddr( pthread_attr_t *tattr, void *stackaddr );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

設定線程堆棧的基地址。

如果stackaddr設定為非空值(預設值是null 指標),那麼線程堆棧將從這裡開始;如果是NULL,那麼pthread_create()為線程分配堆棧。

20.擷取堆棧基址pthread_attr_getstackaddr

#include <pthread.h>
int pthread_attr_getstackaddr( pthread_attr_t *tattr, void **stackaddr );
傳回值:函數成功返回0。任何其他傳回值都表示錯誤。

返回由pthread_attr_setstackaddr()函數設定的堆棧地址。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.