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.乙個棧空間...