屬性設定
屬性結構為pthread_attr_t,它同樣在標頭檔案/usr/include/pthread.h中定義
#include
pthread_attr_t attr;
pthread_t tid;
/*初始化屬性值,均設為預設值*/
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, pthread_scope_system);
pthread_create(&tid, &attr, (void *) my_function, null);
屬性物件主要包括是否繫結、是否分離、堆疊位址、堆疊大小、優先順序。預設的屬性為非繫結、非分離、預設1m的堆疊、與父程序同樣級別的優先順序。
關於執行緒的繫結,牽涉到另外乙個概念:輕程序(lwp:light weight process)。輕程序可以理解為核心執行緒,它位於使用者層和系統層之間。系統對執行緒資源的分配、對執行緒的控制是通過輕程序來實現的,乙個輕程序可以控制乙個或多個執行緒。預設狀況下,啟動多少輕程序、哪些輕程序來控制哪些執行緒是由系統來控制的,這種狀況即稱為非繫結的。繫結狀況下,則顧名思義,即某個執行緒固定的"綁"在乙個輕程序之上。被繫結的執行緒具有較高的響應速度,這是因為cpu時間片的排程是面向輕程序的,繫結的執行緒可以保證在需要的時候它總有乙個輕程序可用。通過設定被繫結的輕程序的優先順序和排程級可以使得繫結的執行緒滿足諸如實時反應之類的要求。
執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread_join()函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。程式設計師應該根據自己的需要,選擇適當的分離狀態。設定執行緒分離狀態的函式為
pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。
第二個引數可選為pthread_create_detached(分離執行緒)和 pthread _create_joinable(非分離執行緒)。
這裡要注意的一點是,如果設定乙個執行緒為分離執行緒,而這個執行緒執行又非常快,它很可能在pthread_create函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這樣呼叫pthread_create的執行緒就得到了錯誤的執行緒號。要避免這種情況可以採取一定的同步措施,最簡單的方法之一是可以在被建立的執行緒裡呼叫pthread_cond_timewait函式,讓這個執行緒等待一會兒,留出足夠的時間讓函式pthread_create返回。設定一段等待時間,是在多執行緒程式設計裡常用的方法。但是注意不要使用諸如wait()之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。
另外乙個可能常用的屬性是執行緒的優先順序,它存放在結構sched_param中。用函式pthread_attr_getschedparam和函式pthread_attr_setschedparam進行存放,一般說來,我們總是先取優先順序,對取得的值修改後再存放回去。
再看常用的幾個函式:
1、pthread_attr_init
功能: 對執行緒屬性變數的初始化。
標頭檔案:
函式原型: int pthread_attr_init (pthread_attr_t* attr);
函式傳入值:attr:執行緒屬性。
函式返回值:成功: 0
失敗: -1
2、pthread_attr_setscope
功能: 設定執行緒繫結屬性。
標頭檔案:
函式原型: int pthread_attr_setscope (pthread_attr_t* attr, int scope);
函式傳入值:attr: 執行緒屬性。
scope:pthread_scope_system(繫結)
pthread_scope_process(非繫結)
函式返回值得:同1。
3、pthread_attr_setdetachstate
功能: 設定執行緒分離屬性。
標頭檔案:
函式原型: int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);
函式傳入值:attr:執行緒屬性。
detachstate:pthread_create_detached(分離)
pthread_create_joinable(非分離)
函式返回值得:同1。
4、pthread_attr_getschedparam
功能: 得到執行緒優先順序。
標頭檔案:
函式原型: int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);
函式傳入值:attr:執行緒屬性;
param:執行緒優先順序;
函式返回值:同1。
5、pthread_attr_setschedparam
功能: 設定執行緒優先順序。
標頭檔案:
函式原型: int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);
函式傳入值:attr:執行緒屬性。
param:執行緒優先順序。
函式返回值:同1。
然後編寫乙個程式練習 :
/*threadtest2.c*/
#include
#include
#include
#include
/*宣告執行緒執行服務程式*/
static void pthread_func_1 (void);
static void pthread_func_2 (void);
int main (void)
; //屬性結構
/*屬性設定*/
pthread_attr_init (&attr); //初始化屬性
pthread_attr_setscope (&attr, pthread_scope_system); //繫結
pthread_attr_setdetachstate (&attr, pthread_create_detached); //分離
/*分別建立執行緒1、2*/
ret = pthread_create (&pt_1, //執行緒識別符號指標
&attr, //預設屬性
(void *)pthread_func_1,//執行函式
null); //無引數
if (ret != 0)
ret = pthread_create (&pt_2, //執行緒識別符號指標
null, //預設屬性
(void *)pthread_func_2, //執行函式
null); //無引數
if (ret != 0)
/*等待執行緒2的結束*/
pthread_join (pt_2, null);
sleep(2);//注意執行緒2結束時執行緒1沒結束,這裡不呼叫sleep會看不到
printf ("main programme exit!/n");
return 0;
}
/*執行緒1的服務程式*/
static void pthread_func_1 (void)
sleep (1);
}
}
/*執行緒2的服務程式*/
static void pthread_func_2 (void)
pthread_exit (0);
} 編譯:
$ gcc threadtest2.c -lpthread -o threadtest2
執行:$ ./threadtest2
好,執行結果如下:
this is pthread1!
this is pthread2!
this is pthread2!
this is pthread2!
this is pthread1!
this is pthread1!
main programme exit!
Linux多執行緒程式設計(二) 執行緒屬性
pthread介面允許我們通過設定每個物件關聯的不同屬性來細調執行緒的行為。include int pthread attr init pthread attr t attr int pthread attr destroy pthread attr t attr 兩個函式的返回值 若成功,返回0 ...
Linux多執行緒程式設計(2)執行緒同步
執行緒同步 a.mutex 互斥量 多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重要性是同樣的問 題。假如 兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成 1.從記憶體讀變數值到暫存器 2.暫存器的值加1 3.將暫存器的值寫回記憶體 我們通過乙個簡單的程式...
Linux多執行緒程式設計入門 2
執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。在上面的例子中,我們採用了執行緒的預設屬性,即為非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當 pthread join 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執...