1、什么是線程?
簡單來說,我們知道一個進程就是一段程序的執行,但是一段程序可以實現很多功能,而我們可以簡單的認為,每一個功能就是一個線程,線程就是進程內執行的任務。一個進程內部可以有很多的線程。線程是CPU使用的基本單元,它由線程ID、程序計數器、寄存器集合和棧組成。它與屬於同一進程的其他線程共享代碼段、數據段和其他操作系統資源。
2、多線程的優點;
(1)響應度高:如果對一個交互程序采用多線程,即使有部分線程阻塞或執行冗長的操作,該程序也能繼續執行,從而增加對用戶的相應程度
(2)資源共享:多線程默認共享他們所屬進程的內存和資源
(3)經濟:進程創建所需要的內存和資源的分配比較昂貴,由於線程能夠共享他們的進程的資源,所以創建線程比進程經濟;
(4)多處理器體系結構的利用:多線程的優點是充分利用多處理器體系結構,以便每個進程能夠並行運行在不同的處理器上。
3、多線程的模型:
有兩種不同的方式來提供線程支持:用戶層的用戶線程和內核層的內核線程,根絕內核線程和用戶線程的對應關系,多線程的模型可以分為三種:
(1)多對一模型:
就是將多用戶線程映射到一個內核線程,線程管理是在用戶空間進行的,因而效率比較高,但是如果一個線程阻塞,那么整個進程就會阻塞,因為任意時刻只有一個線程訪問內核,所以多個線程並不能運行在多處理器上;
(2)一對一模型:
將每個用戶線程映射到一個內核線程上,該模型在一個線程執行阻塞系統調用時,能允許另一個線程繼續執行,所以效率比多對一模型高;
(3)多對多模型:
允許多個用戶線程復用一個內核線程,也允許一個用戶線程專用一個內核線程,這稱為“二級模型”,效率比上面兩種模型都高,但是相對的,實現也更加困難。
4、多線程的問題:
(1)fork()和exec()函數問題
unix系統有兩種形式的fork(),一種是復制所有的線程,另外一種是只復制調用了系統fork()函數的線程。
調用了exec()函數之后,exec()參數指定的程序會替換整個進程。
(2)線程取消:
要取消的線程我們成為目標線程,主要由兩種方式:
(1)異步取消:一個線程立即終止目標線程
(2)延遲取消:目標線程不斷檢查它是都應終止,這允許目標線程有機會以有序方式來終止自己。