Linux多執行緒程式設計

2021-08-11 14:50:26 字數 2037 閱讀 8273

1. 執行緒和程序的區別:

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

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

執行緒和程序比起來很小,所以相對來說,執行緒花費更少的cpu資源。

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

表示程序號的為pid_t型別,表示執行緒號的是pthread_t型別; pthread_t是乙個結構體而不是整型;

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

使用pthread_self函式來獲取執行緒的id;

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

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

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 多執行緒程式設計

1.建立執行緒和退出的函式原型 int pthread create pthread t thread,pthread attr t attr,void start routine void void arg pthread exit 0 其他還有很多相關的函式。2.編譯時要加上 lpthread ...

Linux多執行緒程式設計

linux 多執行緒程式設計 多執行緒支援 posix 執行緒介面,稱為 pthread,pthread create 用來建立執行緒,pthread join 等待執行緒結束,函式的原型分別如下 extern int pthread create p pthread t thread,const ...

linux 多執行緒程式設計

多執行緒的使用 典型的執行緒包括乙個執行時間系統,它可以按透明的方式來管理執行緒。通常執行緒包包括對執行緒的建立和刪除,以及對互斥和條件變數的呼叫。posix標準執行緒庫具有這些呼叫。這些包還提供執行緒的動態建立和刪除,因此,直到執行時間之前,執行緒的個數不必知道。執行緒具有乙個id 乙個堆疊 乙個...