linux c語言高階程式設計 執行緒基礎

2021-09-28 13:53:51 字數 4586 閱讀 9134

程式:二進位制檔案,存放在磁碟上面的檔案

程序:正在執行的程式,它處在記憶體中,乙個程序可以被載入無數次

執行緒:程序的最小活動單元,乙個程序中可以有多個執行緒,至少有乙個執行緒那就是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...