Linux系統下的多執行緒程式設計入門二

2021-06-15 22:07:18 字數 2058 閱讀 9639

修改執行緒的屬性

在上一節的例子裡,我們用pthread_create函式建立了乙個執行緒,在這個執行緒中,我們使用了預設引數,即將該函式的第二個引數設為null。的確,對大多數程式來說,使用預設屬性就夠了,但我們還是有必要來了解一下執行緒的有關屬性。

關於執行緒的繫結,牽涉到另外乙個概念:輕程序(lwp:light weight process)。輕程序可以理解為核心執行緒,它位於使用者層和系統層之間。系統對執行緒資源的分配、對執行緒的控制是通過輕程序來實現的,乙個輕程序可以控制乙個或多個執行緒。預設狀況下,啟動多少輕程序、哪些輕程序來控制哪些執行緒是由系統來控制的,這種狀況即稱為非繫結的。繫結狀況下,則顧名思義,即某個執行緒固定的"綁"在乙個輕程序之上。被繫結的執行緒具有較高的響應速度,這是因為cpu時間片的排程是面向輕程序的,繫結的執行緒可以保證在需要的時候它總有乙個輕程序可用。通過設定被繫結的輕程序的優先順序和排程級可以使得繫結的執行緒滿足諸如實時反應之類的要求。

設定執行緒繫結狀態的函式為 pthread_attr_setscope,它有兩個引數,第乙個是指向屬性結構的指標,第二個是繫結型別,它有兩個取值: pthread_scope_system(繫結的)和pthread_scope_process(非繫結的)。下面的**即建立了乙個繫結的執行緒。

#include <pthread.h>

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);

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。在上面的例子中,我們採用了執行緒的預設屬性,即為非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當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進行存放,一般說來,我們總是先取優先順序,對取得的值修改後再存放回去。下面即是一段簡單的例子。

#include <pthread.h>

#include <sched.h>

pthread_attr_t attr;

pthread_t tid;

sched_param param;

int newprio=20;

pthread_attr_init(&attr);

pthread_attr_getschedparam(&attr, ¶m);

param.sched_priority=newprio;

pthread_attr_setschedparam(&attr, ¶m);

pthread_create(&tid, &attr, (void *)myfunction, myarg);

Linux系統下C 多執行緒程式設計

2017 0924 c 編譯執行 2017 0924 記錄執行時間 1 c 編譯執行 linux下,c 可執行檔案 out 編譯 c g ex1.cpp o ex1 ex1.cpp 為原始檔,名字字尾名隨意,ex1為可執行性檔案,預設為.out檔案,字尾名省略 c語言 gcc ex1.c o ex1...

linux下多執行緒程式設計

先看執行的結果 1 主函式正在建立執行緒,2執行緒1被建立 3 thread1 i m thread 1th 4執行緒2被建立 5 thread2 i m thread 2nd 6 thread2 number 0 7執行緒3被建立 8主函式正在等待執行緒結束.9 thread1 number 0 ...

Linux下的多執行緒程式設計

執行緒是作業系統能夠進行排程運算的最小單位,它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序可以併發多個執行緒,每條執行緒執行不同的任務。include intpthread create pthread t pthread,const pthread...