Pthread-----筆記1

來源:互聯網
上載者:User

標籤:

pthread_t:線程ID

轉自http://blog.csdn.net/hudashi/article/details/7709413

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                失敗: -12、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來釋放系統資源。

Pthread-----筆記1

聯繫我們

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