第11章 線程基礎知識(1)

1.線程的使用

    多線程獨立執行各自任務使得進程可在某一時刻處理多件事情。

    好處:(1)事件的處理可採用同步方式;(2)多個進程必須使用操作系統提供的機制纔可實現內存與文件描述符的共享,而使用多個線程可自動訪問相同地址空間和文件描述符;(3)使用多線程可將問題分解,多個線程可交叉執行多個獨立的任務。(4)多線程可將交互程序中處理用戶輸入輸出部分與其他部分分開。

    一個進程的所有信息對於內部的線程都是共享的,包括可執行代碼,程序的全局內存和堆內存,棧以及文件描述符。Linux系統下的多線程遵循POSIX線程接口,稱爲pthread。

2.線程標識

    進程ID在整個系統中是唯一的,線程ID只有在所屬進程上下文中才有意義。

    進程ID用pid_t類型表示,是非負整數,線程ID用pthread_t 結構表示。由於使用結構表示,就不能用可移植的方式打印ID。線程可通過pthread_self()獲得自身的線程ID。

多線程處理問題的方式:

    主線程將新作業放入隊列中,使用線程ID來控制每個工作線程處理哪些工作。主線程會在每個待處理的作業中放置處理該作業的線程ID,每個工作線程只可以移出標有自己ID的作業。

 

3.線程的創建

    使用pthread_create函數創建。

若創建線程成功。(1)新線程ID會被設置成tidp指向的內存單元;(2)attr參數用於定製線程的屬性;(3)新創建的線程從start_rtn函數的地址開始執行,該函數的參數可通過arg傳入。(4)restrict修飾過的指針所指向的內容只能經由該指針修改。

4.線程終止

    進程中任意線程調用exit,_Exit 或者_exit,整個進程就會終止。而線程可以在不終止整個進程的情況下停止其工作流。有三種方式退出:

    (1)從啓動例程中返回,返回值是線程的退出碼;

    (2)被同一進程中的其他線程取消;

    (3)調用pthread_exit。

(1) pthread_exit()函數:

rval_ptr參數是無類型指針,保存線程退出後的返回值。進程中其他線程也可通過pthread_join()訪問這個指針。

(2) pthread_join()函數:

  pthread_join()以阻塞的方式等待thread指定的線程結束。若線程從啓動例程返回,rval_ptr會包含返回碼。若線程被取消,由rval_ptr指定的內存單元就設置爲PTHREAD_CANCELED。如果rval_ptr設置爲NULL,調用pthread_join可以等待指定線程終止,但不會獲取線程終止狀態。

(3) pthread_cancel()函數:

使用該函數來請求取消同一進程中的其他線程。但只是提出請求,並不等待線程終止,線程可以忽略取消或控制如何被取消。

(4) 線程清理處理程序:

線程可安排它退出時需調用的函數,這類似於進程退出時使用atexit函數。一個線程可建立多個清理處理程序,這些處理程序會被記錄在棧中,所以他們的執行順序與註冊順序相反。如果線程通過啓動例程返回而終止的話,清理程序不會被調用。清理函數是由pthread_cleanup_push函數調度的。當線程執行: 1> pthread_exit時;2> 響應取消函數時;3> 調用pthread_cleanup_pop時會調用清理程序。

線程函數與進程函數的對比:

(5)pthread_detach()函數

用於分離線程,可通過修改傳給pthread_creat函數的線程屬性,創建處於分離狀態的線程。默認情況,線程終止狀態會保存,直到調用pthread_join。若線程被分離,則線程在終止時資源會被立即收回。分離後的線程不能再使用pthread_join等待其終止狀態,否則產生未定義行爲。

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