1. 程式人生 > >執行緒屬性pthread attr t簡介

執行緒屬性pthread attr t簡介

本文編輯整理自:  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
 
      

 

#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