linux的多執行緒預習

2021-08-11 12:39:01 字數 2533 閱讀 8957

1.

執行緒和程序的區別:

程序是系統中程式執行和資源分配的基本單位。每個程序有自己的資料段、**段和堆疊段。

執行緒通常叫做輕型的程序。執行緒是在共享記憶體空間中併發執行的多道執行路徑,他們共享乙個程序的資源。

執行緒和程序比起來很小,所以相對來說,

執行緒花費更少的cpu資源。

2.如何來標識乙個執行緒?

表示程序號的為

pid_t

型別,表示執行緒號的是

pthread_t

型別;

pthread_t

是乙個結構體而不是整型;

使用pthread_equal

確定兩個執行緒號是否相等;

使用pthread_self

函式來獲取執行緒的id;

3.執行緒是如何建立和退出的?

執行緒退出時使用函式pthread_exit,是執行緒的主動行為。注意程序退出時使用

exit

函式,執行緒中用

pthread_exit

替代exit

。wait

系統呼叫。

4. 如何實現單個執行緒的退出?

如果乙個執行緒呼叫了

exit, _exit,

或者_exit

,將導致整個程序的終止。要實現單個執行緒的退出,可以採用如下方式:

(1)執行緒可以簡單的從

start routine

返回,返回值就是執行緒的退出**。

(2)執行緒可以被同一程序中的其它執行緒終止。

(3)執行緒呼叫

pthread_exit

5.如何使呼叫執行緒阻塞等待指定執行緒的退出,並獲得退出執行緒的返回碼?

呼叫執行緒將會被阻塞直到指定的執行緒終止。如果執行緒簡單的從

start routine

返回則rval_ptr

將包含返回**。如果執行緒是被撤銷(呼叫

pthread_exit)

的,rval_ptr

指向的記憶體位址將被設定為

pthread_canceled.

通過呼叫

pthread_join

,我們自動的將乙個執行緒變成分離狀態,這樣就可以實現

資源的**

。如果執行緒已經處於分離狀態,呼叫pthread_join將會失敗,並返回

einval

。如果我們對於執行緒的返回值不感興趣,可以將

rval_ptr

設定成null

。 值得注意的是,

pthread_create

和 pthread_exit

函式的無型別指標可以傳遞複雜的結構資訊,但這個結構所使用的內存在呼叫者完成後必須仍然有效

(分配在堆上或者是靜態變數)

,否則就會出現使用無效的錯誤。

6.如何通過乙個執行緒讓另外乙個執行緒退出?

呼叫pthread_cancel

函式將導致

tid所指向的執行緒終止執行。但是,乙個執行緒可以選擇忽略其它執行緒控制該執行緒何時退出。注意,該函式並不等待執行緒終止,它僅僅提出要求

7.如何實現執行緒退出時的清理動作?

執行緒可以建立多個清理處理程式,這些程式記錄在棧中,也就是說他們的執行順序與註冊順序想法。使用如下函式註冊清理函式:

void pthread_cleanup_push(void (*rtn)(void *), void *arg);

void pthread_cleanup_pop(int execute);

rtn將被呼叫,並傳以

arg引數,引起該函式呼叫的情況如下:

1.呼叫

pthread_exit

2.對於退出請求的反應

3.以非

0引數呼叫

pthread_cleanup_push

如果pthread_cleanup_pop

的引數非

0則僅僅移除該處理函式而不執行。

如果函式已經處於分離狀態,則當它退出時執行緒底層的儲存資源會被立即**。處於分離狀態的執行緒,如果呼叫

pthread_join

來等待其退出將會出現錯誤。

8.linux下提供那些方式處理執行緒同步?

linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數和訊號量。

9.什麼情況會發生執行緒死鎖,如何避免死鎖?

如果乙個執行緒對

mutex

加兩次鎖則顯然會導致死鎖。

死鎖可以通過控制加鎖的順序來避免。有兩個

mutex a和b

,如果所有的執行緒總是先對

a加鎖再對

b加鎖就不會產生死鎖。但實際應用中可能很難保證這種順序加鎖的方式,這種情況下,可以使用

pthread_mutex_trylock

來避免死鎖的發生。

10.什麼是條件變數,它有什麼作用?

條件變數是執行緒可用的另外一種同步機制。條件變數給多個執行緒提供了乙個會合的場所。條件變數與互斥量一起使用時,允許執行緒以無競爭的方式等待特定條件的發生。條件本身是由互斥量保護的。執行緒在改變狀態前必須首先鎖住互斥量,其它執行緒在獲得互斥量之前不會覺察到這種變化。

linux多執行緒

linux下為了多執行緒同步,通常用到鎖的概念。posix下抽象了乙個鎖型別的結構 ptread mutex t。通過對該結構的操作,來判斷資源是否可以訪問。顧名思義,加鎖 lock 後,別人就無法開啟,只有當鎖沒有關閉 unlock 的時候才能訪問資源。它主要用如下5個函式進行操作。1 pthre...

linux多執行緒

執行緒標識 就像每個程序都有乙個id一樣,執行緒也有自己的id。程序id用pid t來表示,他是乙個unsigned int。程序id用pthread t來表示,pthread t不能把它當整數處理。程序可以通過pthread self 函式獲得自身的執行緒id。執行緒建立 在程序中只有乙個控制線程...

Linux多執行緒

一 執行緒的特點 1.執行緒是程序的乙個執行流,是cpu排程和分配的基本單位。執行緒是程式執行的最小單位。2.執行緒不會影響到其它執行緒的執行。比如乙個執行緒崩潰,其它執行緒正常執行。3.同一程序內的執行緒共享程序的位址空間。二 乙個執行緒的組成 1.乙個指向當前被執行指令的指令指標 2.乙個棧空間...