多線程

1. 線程和進程的區別:

進程是系統中程序執行和資源分配的基本單位。每個進程有自己的數據段、代碼段和堆棧段。

線程通常叫做輕型的進程。線程是在共享內存空間中併發執行的多道執行路徑,他們共享一個進程的資源。

線程和進程比起來很小,所以相對來說,線程花費更少的CPU資源

 

 

2.如何來標識一個線程?

   表示進程號的爲pid_t類型,表示線程號的是pthread_t類型; pthread_t是一個結構體而不是整型;

   使用pthread_equal確定兩個線程號是否相等;

   使用pthread_self函數來獲取線程的ID

 

 

 

3.線程是如何創建和退出的?

 

創建線程使用pthread_create函數。在線程創建以後,就開始運行相關的線程函數。

線程退出時使用函數pthread_exit,是線程的主動行爲。注意進程退出時使用exit函數,線程中用pthread_exit替代exit

由於一個進程中的多個線程共享數據段,因此通常在線程退出後,退出線程所佔用的資源並不會隨線程結束而釋放。所有需要pthread_join函數來等待線程結束,類似於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 AB,如果所有的線程總是先對A加鎖再對B加鎖就不會產生死鎖。但實際應用中可能很難保證這種順序加鎖的方式,這種情況下,可以使用pthread_mutex_trylock來避免死鎖的發生。

 

 

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章