本節書摘來自異步社群出版社《c++多線程程式設計實戰》一書中的第1章,第1.3節,作者: 【黑山共和國】milos ljumovic(米洛斯 留莫維奇),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
1.3 程式結構、執行流和運作時對象
程式設計範式是計算機程式設計的基本樣式,主要有4種範式:指令式、聲明式、函數式(或結構式)、面向對象式。c++是當今最流行的面向對象程式設計語言之一,集功能性、靈活性、實用性于一體。和c一樣,程式員能很快地适應它。c++成功的關鍵在于,程式員可以根據實際需要做相應地調整。
但是,c++學起來并不輕松。有時,你會認為這是一門高深莫測、難以捉摸的語言,一門永遠學不完也無法完全了解和掌握的語言。别擔心,學習一門語言并不是要掌握它的所有細枝末節,關鍵要學會如何正确地用語言特性解決特定的問題。實踐是最好的老師,根據具體情況盡可能多地使用相應的特性,有助于加深了解。
在給出示例前,我們先介紹一下查爾斯·西蒙尼的匈牙利表示法。他在1977年的博士論文中,使用元程式設計(meta-programming)(一種軟體生産方法)在程式設計中制定了标準的表示法。文中規定類型或變量的第1個字母表示資料類型。例如,如果要給一個類命名,<code>tes</code>t資料類型應該是<code>ctes</code>t。第1個字母c表示test是一個類。這個方法很不錯,因為不熟悉<code>tes</code>t資料類型的程式員會馬上明白test是一個類名。基本資料類型也可以這樣處理,以<code>int和</code>double<code>為例,</code>icount<code>表示一個int類型的變量</code>count<code>,而dvalues表示一個double</code>類型的變量<code>value</code>。有了這些字首,即使不熟悉代碼也很容易識别它們的類型,提高了代碼的可讀性。
準備就緒
确定安裝并運作了visual studio(vs)。
操作步驟
根據以下步驟建立我們的第1個程式示例。
1.建立一個預設的c++控制台應用程式[1],命名為<code>testdemo</code>。
2.打開<code>testdemo.cpp</code>。
3.輸入下面的代碼:
int _tmain(int argc, tchar* argv[])
void _tmain(int argc, tchar* argv[])
int _tmain(void)
void _tmain(void)<code>`</code>
第1種原型有兩個參數:<code>argc</code>和<code>argv</code>。第1個參數<code>argc</code>(即,參數計數)表示第2個參數<code>argv</code>(即,參數值)中的參數個數。形參<code>argv</code>是一個字元串數組,其中的每個字元串都代表一個指令行參數。<code>argv</code>中的第1個字元串一定是目前程式的名稱。第2種原型和第1種原型的參數類型、參數個數相同,但是傳回類型不同。這說明<code>main</code>函數可能傳回值,也可能不傳回值。該值将被傳回給作業系統。第3種原型沒有參數,并傳回一個整型值。第4種原型既沒有參數也沒有傳回類型。看來,用第1種原型作為練習很不錯。
函數體中的第1條語句使用了<code>cout</code>對象。<code>cout</code>是c++中标準輸出流的名稱。整條語句的意思是:把一系列字元(該例中是<code>hello world</code>字元序列)插入标準輸出流(通常對應的是螢幕)。
<code>cout</code>對象聲明在std名稱空間的<code>iostream</code>标準檔案中。是以,要是用該對象必須包含相應的頭檔案,并且在<code>_tmain</code>函數前面先聲明其所屬的名稱空間。
在我們使用的原型中(<code>int _tmain(int, _tchar*)</code>),_tmain傳回一個整數。是以,必須在<code>return</code>關鍵字後面指定相應的int類型值,本例中是0。向作業系統傳回值時,0通常表示執行成功。但是,具體的值由作業系統決定。
這個小程式非常簡單。我們以此為例解釋<code>main</code>`例程作為每個c++程式入口點的基本結構和用法。
單線程程式按順序逐行執行。是以,如果把所有的代碼都寫成一個線程,這樣的程式對使用者并不友好。
如圖1.1所示,應用程式要等使用者輸入資料後,才能重新獲得控制權繼續執行。為此,可以建立并發線程來處理使用者的輸入。這樣,應用程式随時都能響應,不會在等待使用者輸入時毫無反應了。線程處理完自己的任務後,可以給應用程式發信号,告訴程式使用者已完成相應操作。

圖1.1 單線程程式按順序逐行執行
更多讨論
每次我們要在主執行流中單獨執行一個操作,都必須考慮使用一個單獨的線程。最簡單的例子是,實作一邊計算一邊在進度條上反映計算的進度。想在同一個線程中處理計算和更新進度條,可能行不通。因為如果一個線程既要進行計算又要更新ui,就不能充分地與作業系統繪畫互動。是以,一般情況下我們總是把ui線程與其他工作線程分開。
來看下面的例子。假設我們建立了一個用于計算的函數(如,計算指定角度的正弦值或餘弦值),我們要同步顯示計算過程的進度: