POSIX Threads
一、 需要掌握的知識點
二、概念
由於同一進程的多個線程共享同一地址空間,因此Text Segment、Data Segment都是共享的,如果定義一個函數,在各線程中都可以調用,如果定義一個全局變量,在各線程中都可以訪問到,除此之外,各線程還共享以下進程資源和環境:
· 文件描述符表
· 每種信號的處理方式(SIG_IGN
、SIG_DFL
或者自定義的信號處理函數)
· 當前工作目錄
· 用戶id和組id
但有些資源是每個線程各有一份的:
· 線程id
· 上下文,包括各種寄存器的值、程序計數器和棧指針
· 棧空間
· errno
變量
· 信號屏蔽字
· 調度優先級
三、線程的優缺點
Ø 優點:
1. 創建一個新線程的總開支明顯比創建一個新進程的要小得多(盡管linux在創建新進程方面特別高效)
2. 如果想讓一個程序似乎在同時做兩件事,線程是非常有用的。
For example:當一個實時計數字數的文檔還在編輯內容期間,我們可以使用一個線程來管理用戶的輸入和執行編輯,另一個線程可以觀察同個文檔內容,連續不斷的更新字數計數變量,這樣第一個線程就能實時保持分享這個變量給用戶。
3. 當一個應用程序通過運行3個線程來操作輸入,計算,輸出的時候,性能上明顯改進了。
For example:當輸入或者輸出線程正在等待一個連接的時候,另一個線程可以繼續運行它的計算。
4.現在多芯處理器是常見的,即使在桌面和筆記本電腦的機器,在一個進程裡面使用多線程,如果應有程序合適的話,能夠讓進程更好的利用硬件資源。
5.通常,在線程間進行轉換要求操作系統所需要做的事比在進程間進行轉換要少得多,所以多線程在資源的要求比多進程低得多。
Ø 缺點
1)線程的死鎖。即較長時間的等待或資源競爭以及死鎖等多線程症狀。
2)對公有變量的同時讀或寫。當多個線程需要對公有變量進行寫操作時,後一個線程往往會修改掉前一個線程存放的數據,從而使前一個線程的參數被修改;另外 ,當公用變量的讀寫操作是非原子性時,在不同的機器上,中斷時間的不確定性,會導致數據在一個線程內的操作產生錯誤,從而產生莫名其妙的錯誤,而這種錯誤是程序員無法預知的。
四、如果在程序中要使用線程,就必須定義一個宏_REENTRANT,再包含進頭文件pthread.h,鏈接上線程庫通過使用-lpthread.
五、創建一個新的線程
#include<pthread.h>
intpthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
thread:指向一個pthread_t結構類型,當一個線程被創建時,一個標識符會被寫入一個存儲單元,這個單元的地址會被寫入thread,這個標識符可以讓你了解這個thread。
Attr:指向pthread_attr_t結構類型,這個結構類型可以用來設置線程的屬性,如果不需要設置特別的屬性時,可以使用NULL。
Start_routine:這個函數指針用來告知新創建的線程要開始執行的函數,其中的參數是由arg傳入。
Arg:作為參數傳入到start_routine。
返回值:0時成功,或者一個錯誤值用來標志錯誤。