本節書摘來自異步社群出版社《c++多線程程式設計實戰》一書中的第2章,第2.7節,作者: 【黑山共和國】milos ljumovic(米洛斯 留莫維奇),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
我們可以把程序看作是一個對象,它的任務就是把相關資源分組。每個程序都有一個位址空間,如圖2.10所示。

圖2.10 程序的位址空間
這個所謂的程序圖像必須在初始化<code>createprocess</code>時加載至實體記憶體中。所有的資源(如檔案句柄、子程序的資訊、信号處理器等)都被儲存起來。把它們以程序的形式分組在一起,更容易管理。
除程序外,還有一個重要的概念是線程。線程是cpu可執行排程的最小機關。也就是說,程序本身不能獲得cpu時間,隻有它的線程才可以。線程通過它的工作變量和棧來儲存cpu寄存器的資訊。棧包含與函數調用相關的資料,在每個函數被調用但尚未傳回時,為其建立一個架構。線程可以在cpu上執行,而程序則不行。但是,程序至少必須有一個線程,通常把這個線程稱為主線程。是以,當我們說在cpu上執行的程序時,指的是程序中的主線程。
程序用于分組資源,線程是在cpu上排程執行的實體。在同一個程序環境中可以執行多個線程,了解這點很重要。多線程并行運作在一個程序上下文,與在一個計算機中并行運作的多個程序相同。術語“多線程”指的是在單程序上下文中運作的多線程。
如圖2.11所示,有3個程序,每個程序中都有一個線程。
圖2.11 3個程序中各有1個線程
圖2.12示範了一個有3個線程的程序。雖然這兩種情況中都有3個線程,但是在圖2.11中,每個線程都在不同的位址空間中運作,而圖2.12中的3個線程共享同一個位址空間。
圖2.12 有3個線程的程序
在單核cpu系統中運作多線程的程序時,各線程輪流運作。系統通過快速切換多個程序,營造并行處理的假象。多線程也以這樣的方式運作。一個有3個線程的程序,其各線程表現為并行運作。單核cpu每次運作一個線程,花費cup排程處理該程序時間的1/3(大概是這樣,cpu時間取決于作業系統、排程算法等)。在多處理器系統中,情況類似。隻有單核cpu執行線程時才與本書描述的方式相同。多核的好處是,可以并行運作更多的線程,充分發揮本地硬體的并行處理能力和多線程的執行能力。
下面的例子用兩個線程實作一個簡單的數組排序,示範了線程的基本用法。
準備就緒
确定安裝并運作了visual studio。
操作步驟
1.建立一個新的預設win32控制台應用程式,名為<code>multithreadedarraysort</code>。
2.打開<code>multithreadedarraysort.cpp</code>,并輸入下面的代碼:
handle createthread( lpsecurity_attributes lpthreadattributes,
size_t dwstacksize, lpthread_start_routine lpstartaddress,
lpvoid lpparameter, dword dwflags, lpdword lpthreadid );<code>`</code>
設定線程的開始位址(<code>lpstartaddress</code>)和設定傳給線程例程的值(<code>lpparameter</code>)很重要。<code>lpparameter</code>是一個預定義例程(函數)指針,如下代碼所示: