Hello大家好,小豆君又和大家見面啦。

在現代化的體系結構中,通常是多核處理器執行多個任務和多執行緒。從而,程式執行時間會得到大大的改善。

但是,並行處理也給程式設計帶來了新的挑戰,我們所熟悉的完成一條語句,再執行下一條語句被顛覆。多條語句同時執行,併發的訪問同一資源,造成建立、讀取、寫入、刪除等動作存在不可預期的結果。增加了程式的複雜性和不可維護性。

因此,多執行緒程式設計也成為很多程式設計師的噩夢,所以,從本篇文章開始,小豆君就分享下我對多執行緒的理解,如果文章中有問題,還希望大家幫忙指出,多多交流,追求對程式的精準理解才能幫助我們共同成長。

因為我對windows研究的多一點,所以小豆君的分享都主要以windows為主。

因為我希望這是一個比較完整的體系,所以在講解執行緒之前,先來認識一下什麼是程序,因為執行緒都是在程序的地址空間中建立和執行的,多多認識程序的知識點,會幫助我們更好的理解執行緒,為了學習不枯燥,我把程序最關鍵的知識點都列到了這裡,這對於學習執行緒已經足夠了。

1 什麼是程序

在講述一個概念,最好的方法是拿它和已有的概念作對比。可執行程式(windows中的exe程式),相信大家並不陌生,而當我們執行這個exe時,此時在任務管理器中可以看到它,那我們稱該執行的exe為一個程序。

所以,程序簡單的理解就是“一個正在執行的程式例項”,為什麼是“一個”,因為一個程式我們可以開啟多次,當我們開啟兩次時,這就是兩個程序了。(對於那些只執行一個例項的程式,是在程式碼中做了處理的)

2 程序的組成

1)核心物件:當建立一個程序時,作業系統會建立一個物件用來記錄程序的各類資訊,然後返回一個控制代碼來操作這個程序。

2)地址空間:前面我們講了,一個程式可以對應多個程序例項,這些程序之所以能夠做到互不干擾,就是因為它們有著不同的地址空間,相當於作業系統為每個程序分配了不同的房間,它們可以無干擾的執行,而在這個房間裡面還放置了所有的可執行模組或DLL模組的程式碼和資料。

3 程序和執行緒的關係

小豆君曾很長一段時間認為程序是“活潑”的,即使沒有執行緒,它也是可以執行的,然而這是非常錯誤的。

其實,程序是死的,不活潑的,它是一個執行緒的容器。若要使它完成某項任務,它必須擁有一個在它的環境中執行的執行緒,該執行緒負責執行包含在程序空間中的程式碼。如果做一個比喻的話,程序更像是人的肉體,執行緒則是人的靈魂。

如果有多個執行緒,那麼這些執行緒也都可以執行程序空間中的程式碼。當然了,它們也都可以“同時”執行。

為了滿足執行緒間同時執行的需求,每個執行緒都擁有自己的CPU暫存器,自己的堆疊。當我們使用windows的介面建立執行緒時,作業系統就會在核心中建立一個執行緒物件,而這個物件就會記錄執行緒的所有資訊。這時,我們回想下Qt中經常聽到的執行緒本地迴圈等相關概念,你是不是有了新的啟發。

我們可以把作業系統建立的核心物件當做一種記錄資料的資料結構會更好理解。

每個程序至少擁有一個執行緒來執行程序的地址空間中的程式碼。如果沒有執行緒來執行程序的地址空間中的程式碼,那麼程序就沒有存在的理由了,系統就將自動撤消該程序和它的地址空間。

若要使所有這些執行緒都能執行,作業系統就要為每個執行緒安排一定的CPU時間。它透過以一種迴圈方式為執行緒提供時間片,這造成一種假象,彷彿所有執行緒都是同時執行的一樣。而對於現在的多核處理器,就可以做到真正的一個執行緒佔用一個CPU。

當建立一個程序時,系統就會自動建立它的第一個執行緒,稱為主執行緒。然後,該執行緒可以建立其他的執行緒,而這些執行緒又能建立更多的執行緒。

4 啟動程序

我們歸納,當windows啟動一個程序時,它大致的會經歷以下幾個步驟:

1)檢索指向新程序的完整命令列的指標。命令列中的引數指定程序的執行方式或是傳遞給主函式做進一步的處理響應。

2)檢索指向新程序的環境變數的指標。環境變數指定了程序所需資源的路徑或其它資訊。

3)對C/C++執行期的全域性變數進行初始化。如果包含了StdLib。h檔案,程式碼就能訪問這些變數。而我們熟悉的main函式中的argc和argv就包含在此。

4)呼叫C/C++執行期啟動函式,該函式負責對C/C++執行期庫進行初始化,這樣,就可以呼叫malloc和free之類的函數了

5)為所有全域性和靜態C++類物件呼叫建構函式。

6)當所有這些初始化操作完成後,C/C++啟動函式就呼叫應用程式的進入點函式。這就是我們所熟悉的main函式。

5 程序的表現形式

在Windows中,程序有兩種表現形式,一種是基於圖形使用者介面(GUI)的應用程式,另一種是基於控制檯使用者介面(CUI)的應用程式。

基於GUI的就是我們通常所見的帶有使用者互動視窗的應用程式,而CUI通常會作為一個後臺程序或服務程式。

6 程序相關的術語

和程序相關的術語包括命令列、環境變數、程序Id(pid),工作目錄等,這些概念都比較簡單,這裡就不做一一介紹了。

關於程序的概念就分享這麼多了,有了這些知識點的鋪墊,會幫助我們更加容易理解執行緒的執行和程式設計方式,從下一篇文章開始正式進入多執行緒程式設計,最後不要忘記點贊哦,您的支援就是對我最大的鼓勵^_^

更多幹貨文章,歡迎關注:

今日頭條號-

小豆君程式設計分享

Qt多執行緒分享——你必須知道的程序知識點

微信公眾號-

小豆君Qt分享

http://

weixin。qq。com/r/Ni_Zgcz

EoJHfrYji93ok

(二維碼自動識別)