執行緒屬性pthread attr t簡介
阿新 • • 發佈:2018-12-22
本文編輯整理自:
http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html
http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part1/
Posix執行緒中的執行緒屬性pthread_attr_t主要包括scope屬性、detach屬性、堆疊地址、堆疊大小、優先順序。在pthread_create中,把第二個引數設定為NULL的話,將採用預設的屬性配置。 pthread_attr_t的主要屬性的意義如下:
__detachstate
,表示新執行緒是否與程序中其他執行緒脫離同步,
如果設定為
PTHREAD_CREATE_DETACHED
則新執行緒不能用pthread_join()來同步,且在退出時自行釋放所佔用的資源。預設為
PTHREAD_CREATE_JOINABLE
狀態。這個屬性也可以線上程建立並執行以後用
pthread_detach()
來設定,而一旦設定為PTHREAD_CREATE_DETACH狀態(不論是建立時設定還是執行時設定)則不能再恢復到PTHREAD_CREATE_JOINABLE狀態。
__schedpolicy
,表示新執行緒的排程策略,主要包括
SCHED_OTHER
(正常、非實時)、
SCHED_RR
(實時、輪轉法)和
SCHED_FIFO
(實時、先入先出)三種,預設為
SCHED_OTHER
,後兩種排程策略僅對超級使用者有效。執行時可以用過pthread_setschedparam()來改變。
__schedparam
,一個
struct sched_param
結構,目前僅有一個
sched_priority
整型變量表示執行緒的執行優先順序。這個引數僅當排程策略為實時(即SCHED_RR或SCHED_FIFO)時才有效,並可以在執行時通過pthread_setschedparam()函式來改變,預設為
0
。
__inheritsched
,有兩種值可供選擇:
PTHREAD_EXPLICIT_SCHED
和
PTHREAD_INHERIT_SCHED
,前者表示新執行緒使用顯式指定排程策略和排程引數(即attr中的值),而後者表示繼承呼叫者執行緒的值。預設為
PTHREAD_EXPLICIT_SCHED
。
__scope
,表示執行緒間競爭CPU的範圍,也就是說執行緒優先順序的有效範圍。POSIX的標準中定義了兩個值:
PTHREAD_SCOPE_SYSTEM
和
PTHREAD_SCOPE_PROCESS
,前者表示與系統中所有執行緒一起競爭CPU時間,後者表示僅與同進程中的執行緒競爭CPU。目前LinuxThreads僅實現了
PTHREAD_SCOPE_SYSTEM
一值。
為了設定這些屬性,POSIX定義了一系列屬性設定函式,包括
pthread_attr_init()、
pthread_attr_destroy()和與各個屬性相關的
pthread_attr_get
XXX/
pthread_attr_set
XXX函式。
在設定執行緒屬性
pthread_attr_t 之前,通常先呼叫pthread_attr_init來初始化,之後來呼叫相應的屬性設定函式。
主要的函式如下:
1、pthread_attr_init
功能: 對執行緒屬性變數的初始化。
標頭檔案: <pthread.h>
函式原型: int pthread_attr_init (pthread_attr_t* attr);
函式傳入值:attr:執行緒屬性。
函式返回值:成功: 0
失敗: -1
2、pthread_attr_setscope
功能:
設定執行緒
__scope
屬性。scope屬性表示執行緒間競爭CPU的範圍,也就是說執行緒優先順序的有效範圍。POSIX的標準中定義了兩個值:
PTHREAD_SCOPE_SYSTEM
和
PTHREAD_SCOPE_PROCESS
,前者表示與系統中所有執行緒一起競爭CPU時間,後者表示僅與同進程中的執行緒競爭CPU。預設為PTHREAD_SCOPE_PROCESS。
目前LinuxThreads僅實現了PTHREAD_SCOPE_SYSTEM一值。
標頭檔案: <pthread.h>
函式原型:
int
pthread_attr_setscope
(pthread_attr_t* attr, int scope);
函式傳入值:attr: 執行緒屬性。
scope:
PTHREAD_SCOPE_SYSTEM,
表示與系統中所有執行緒一起競爭CPU時間,
PTHREAD_SCOPE_PROCESS,表
示僅與同進程中的執行緒競爭CPU
函式返回值得:同1。
3、pthread_attr_setdetachstate
功能:
設定執行緒
detachstate
屬性。該表示新執行緒是否與程序中其他執行緒脫離同步,如果設定為
PTHREAD_CREATE_DETACHED
則新執行緒不能用pthread_join()來同步,且在退出時自行釋放所佔用的資源。預設為
PTHREAD_CREATE_JOINABLE
狀態。這個屬性也可以線上程建立並執行以後用pthread_detach()來設定,而一旦設定為PTHREAD_CREATE_DETACH狀態(不論是建立時設定還是執行時設定)則不能再恢復到PTHREAD_CREATE_JOINABLE狀態。
標頭檔案: <phread.h>
函式原型:
int
pthread_attr_setdetachstate
(pthread_attr_t* attr, int detachstate);
函式傳入值:attr:執行緒屬性。
detachstate:
PTHREAD_CREATE_DETACHED,
不能用pthread_join()來同步,且在退出時自行釋放所佔用的資源
PTHREAD_CREATE_JOINABLE,
能用pthread_join()來同步
函式返回值得:同1。
4、pthread_attr_setschedparam
功能: 設定執行緒
schedparam
屬性,即呼叫的優先順序。
標頭檔案: <pthread.h>
函式原型: i
nt
pthread_attr_setschedparam
(pthread_attr_t* attr, struct sched_param* param);
函式傳入值:attr:執行緒屬性。
param:執行緒優先順序。
一個struct sched_param結構,目前僅有一個sched_priority整型變量表示執行緒的執行優先順序。這個引數僅當排程策略為實時(即SCHED_RR或SCHED_FIFO)時才有效,並可以在執行時通過pthread_setschedparam()函式來改變,預設為0
函式返回值:同1。
5、pthread_attr_getschedparam
功能: 得到執行緒優先順序。
標頭檔案: <pthread.h>
函式原型:
int
pthread_attr_getschedparam
(pthread_attr_t* attr, struct sched_param* param);
函式傳入值:attr:執行緒屬性;
param:執行緒優先順序;
函式返回值:同1。
示例1:
Posix執行緒中的執行緒屬性pthread_attr_t主要包括scope屬性、detach屬性、堆疊地址、堆疊大小、優先順序。在pthread_create中,把第二個引數設定為NULL的話,將採用預設的屬性配置。 pthread_attr_t的主要屬性的意義如下:
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <pthread.h> static void pthread_func_1 ( void ); static void pthread_func_2 ( void ); int main ( int argc , char ** argv ) { pthread_t pt_1 = 0 ; pthread_t pt_2 = 0 ; pthread_attr_t atrr = { 0 }; int ret = 0 ; /*初始化屬性執行緒屬性*/ pthread_attr_init (& attr ); pthread_attr_setscope (& attr , PTHREAD_SCOPE_SYSTEM ); pthread_attr_setdetachstate (& attr , PTHREAD_CREATE_DETACHED ); ret = pthread_create (& pt_1 , & attr , pthread_func_1 , NULL ); if ( ret != 0 ) { perror ( "pthread_1_create" ); } ret = pthread_create (& pt_2 , NULL , pthread_func_2 , NULL ); if ( ret != 0 ) { perror ( "pthread_2_create" ); } pthread_join ( pt_2 , NULL ); return 0 ; } static void pthread_func_1 ( void ) { int i = 0 ; for (; i < 6 ; i ++) { printf ( "This is pthread_1.\n" ); if ( i == 2 ) { pthread_exit ( 0 ); } } return ; } static void pthread_func_2 ( void ) { int i = 0 ; for (; i < 3 ; i ++) { printf ( "This is pthread_2.\n" ); } return ; }
從上面事例中,可以得到這麼一個結果,就是執行緒一的執行緒函式一結束就自動釋放資源,執行緒二就得等到pthread_join來釋放系統資源。 結束!
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed