程式:二進位制檔案,存放在磁碟上面的檔案
程序:正在執行的程式,它處在記憶體中,乙個程序可以被載入無數次
執行緒:程序的最小活動單元,乙個程序中可以有多個執行緒,至少有乙個執行緒那就是main函式本身
就緒:執行緒即將要執行。可能是剛建立,也可能是剛從阻塞狀態喚醒。
執行:執行緒正在被執行。單處理器中,同一時刻只有乙個執行緒正在執行,多處理器中,同時執行多個執行緒。
阻塞:執行緒無法被執行。比如io阻塞,條件變數阻塞,互斥鎖等。
終止:執行緒函式執行完畢。可能是自然死亡(執行結束return返回),自殺(呼叫return提前結束,或者呼叫pthread_exit結束),也可能是他殺(在其他執行緒呼叫pthread_cancel結束,或者被kill掉,隨程序結束而結束)導致。
執行緒建立:pthread_create
獲取執行緒id:pthread_self
結束執行緒:pthread_exit, pthread_cancel
等待執行緒結束:pthread_join
(1)執行緒建立:
#include
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
引數介紹:
thread 執行緒id(建立執行緒時產生)
attr 執行緒屬性(執行緒優先順序,分離狀態,排程策略等)
start_routine 執行緒函式
arg 執行緒函式的引數
返回值:
0 成功
非0 失敗
(2)獲取執行緒id:
#include
pthread_t pthread_self(void);
返回值:執行緒id
(3)結束執行緒:
#include
void pthread_exit(void *retval);
引數:retval 執行緒結束之後的返回值
返回值:
無int pthread_cancel(pthread_t thread);
引數:thread 執行緒id
返回值:
0 成功
非0 失敗
(4)等待執行緒結束:
#include
int pthread_join(pthread_t thread, void **retval);
引數:thread 執行緒id
retval 執行緒返回值或狀態
執行緒建立時,預設優先順序為0,最大為50
pthread_attr_t屬性的型別
typedef struct
pthread_attr_t;
執行緒屬性相關函式:
初始化:pthread_attr_init
銷毀:pthread_attr_destroy
設定優先順序:pthread_attr_setschedparam
獲取優先順序:pthread_attr_getschedparam
優先順序結構體如下:
struct sched_param;
(1)初始化:
#include
int pthread_attr_init(pthread_attr_t *attr);
引數:attr 執行緒屬性
返回值:
0 成功
非0 失敗
(2)銷毀:
#include
int pthread_attr_destroy(pthread_attr_t *attr);
引數:attr 執行緒屬性
返回值:
0 成功
非0 失敗
(3)設定優先順序:
#include
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
引數:attr 執行緒屬性
param 執行緒優先順序
返回值:
0 成功
非0 失敗
pthread_setschedparam(pthread_t thread, int policy,
const struct sched_param *param);
引數:thread 執行緒id
policy 執行緒排程策略(sched_rr,sched_fifo,sched_other )
param 排程優先順序
struct sched_param ;
成功:返回0
非0:失敗
(4)獲取優先順序:
#include
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
引數:attr 執行緒屬性
param 執行緒優先順序
返回值:
0 成功
非0 失敗
pthread_getschedparam(pthread_t thread, int *policy,
struct sched_param *param);
引數:thread 執行緒id
policy 執行緒排程策略(sched_rr,sched_fifo,sched_other )
param 排程優先順序
struct sched_param ;
成功:返回0
非0:失敗
例項一(執行緒建立例項):
傳整型
void
*run
(void
* arg)
}int
main
(int argc,
char
**ar**)
int b;
scanf
("%d"
,&b);}
傳陣列void
*run
(void
* arg)
//free(p);
}int
main
(int argc,
char
**ar**)
;int i;
//for(i=0;i<5;i++)
//這裡需要呼叫pthread_join函式釋放執行緒資源,建立幾個執行緒 就呼叫幾次
int b;
scanf
("%d"
,&b);}
//原則,盡快的將arg指向的記憶體資料拷到執行緒函式,以免在主函式中將arg指向的值改變。
例項二(執行緒優先順序):
void
*run
(void
* arg)
intmain
(int argc,
char
**ar**)
;pthread_attr_setschedparam
(&attr,
&par)
;for
(i=0
;i<
5;i++
)pthread_attr_destroy
(&attr)
;//這裡需要呼叫pthread_join函式釋放執行緒資源,建立幾個執行緒 就呼叫幾次
int b;
scanf
("%d"
,&b)
;}
例項二.1(執行緒優先順序):
void
*_ao_test_play_thread
(void
* arg)
pthread_getschedparam
(pthread_self()
,&policy,
¶m);printf
("-------------- policy = %d, param=%d\n"
, policy, param.sched_priority )
;while(1
)}intmain
(int argc,
char
**ar**)
}注意:執行緒預設建立排程策略為sched_other(為一般執行緒,priority為0),改變執行緒排程策略為sched_fifo或者sched_rr(實時執行緒)之後,執行緒會比一般執行緒排程優先順序要高,實際測試發現,高負載情況下,實時執行緒執行要比一般執行緒更容易執行(這符合實時執行緒優先順序高於一般執行緒的原理)
例項三(執行緒分離屬性):
#include
#include
#include
#include
void
*thread_run
(void
* _val)
intmain()
linux C 多執行緒程式設計
1.solaris vs.linux posix 庫 solaris 庫 lib 執行緒 linux posix 庫 libp 執行緒 操作sema destroy sem destroy 銷毀訊號狀態。sema init sem init 初始化訊號。sema post sem post 增加訊號...
linux C 多執行緒程式設計
1.solaris vs.linux posix 庫 solaris 庫 lib 執行緒 linux posix 庫 libp 執行緒 操作sema destroy sem destroy 銷毀訊號狀態。sema init sem init 初始化訊號。sema post sem post 增加訊號...
Linux c程式設計 執行緒屬性
前面介紹了pthread create函式,並且當時的例子中,傳入的引數都是空指標,而不是指向pthread attr t結構的指標。可以使用pthread attr t結構修改執行緒預設屬性,並把這些屬性與建立的執行緒聯絡起來。可以使用pthread attr init函式初始化pthread a...