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_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一值。
函數原型: 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);
detachstate:PTHREAD_CREATE_DETACHED,不能用pthread_join()來同步,且在退出時自行釋放所占用的資源
PTHREAD_CREATE_JOINABLE,能用pthread_join()來同步
4、pthread_attr_setschedparam
功能: 設定線程schedparam屬性,即調用的優先級。
函數原型: 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:線程優先級;
#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;
}