(轉)線程屬性pthread_attr_t簡介


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_getXXX/pthread_attr_setXXX函數。
在設置線程屬性 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>
函數原型:   int 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來釋放系統資源。
 
結束!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM