c 併發程式設計基礎(一) 併發 並行域多執行緒

2022-07-23 12:09:12 字數 2161 閱讀 7887

正文

c++11標準在標準庫中為多執行緒提供了元件,這意味著使用c++編寫與平台無關的多執行緒程式成為可能,而c++程式的可移植性也得到了有力的保證。另外,併發程式設計可提高應用的效能,這對對效能錙銖必較的c++程式設計師來說是值得關注的。

回到頂部

併發指的是兩個或多個獨立的活動在同一時段內發生。生活中併發的例子並不少,例如在跑步的時候你可能同時在聽**;在看電腦顯示器的同時你的手指在敲擊鍵盤。這時我們稱我們大腦併發地處理這些事件,只不過我們大腦的處理是有次重點的:有時候你會更關注你呼吸的頻率,而有時候你更多地被美妙的**旋律所吸引。這時我們可以說大腦是一種併發設計的結構。這種次重點在計算機程式設計中,體現為某乙個時刻只能處理乙個操作

與併發相近的另乙個概念是並行。它們兩者存在很大的差別。並行就是同時執行,計算機在同一時刻,在某個時間點上處理兩個或以上的操作。判斷乙個程式是否並行執行,只需要看某個時刻上是否多兩個或以上的工作單位在執行。乙個程式如果是單執行緒的,那麼它無法並行地執行。利用多執行緒與多程序可以使得計算機並行地處理程式(當然 ,前提是該計算機有多個處理核心)。

圖中整個安檢系統是乙個併發設計的結構。兩個安檢佇列隊首的人競爭這乙個安檢視窗,兩個佇列可能約定交替著進行安檢,也可能是大家同時競爭安檢視窗(通訊)。後一種方式可能引起衝突:因為無法同時進行兩個安檢操作。在邏輯上看來,這個安檢視窗是同時處理這兩個佇列。

圖中整個安檢系統是乙個並行的系統。在這裡,每個佇列都有自己的安檢視窗,兩個佇列中間沒有競爭關係,佇列中的某個排隊者只需等待佇列前面的人安檢完成,然後再輪到自己安檢。在物理上,安檢視窗同時處理這兩個佇列。

併發的程式設計,提供了一種方式讓我們能夠設計出一種方案將問題(非必須地)並行地解決。如果我們將程式的結構設計為可以併發執行的,那麼在支援並行的機器上,我們可以將程式並行地執行。因此,併發重點指的是程式的設計結構,而並行指的是程式執行的狀態。併發程式設計,是一種將乙個程式分解成小片段獨立執行的程式設計方法。

回到頂部

多執行緒與多程序是併發的兩種途徑。

想象兩個場景:

這兩個場景描繪了併發的兩種基本途徑。每個小夥伴代表乙個執行緒,工作地點代表乙個處理器。場景一中每個小夥伴是乙個單執行緒的程序,他們擁有獨立的處理器,多個程序同時執行;場景二中只有乙個處理器,所有小夥伴都是屬於同一程序的執行緒。

多個程序獨立地執行,它們之間通過程序間常規的通訊渠道傳遞訊息(訊號,套接字,檔案,管道等),這種程序間通訊不是設定複雜就是速度慢,這是因為為了避免乙個程序去修改另乙個程序,作業系統在程序間提供了一定的保護措施,當然,這也使得編寫安全的併發**更容易。

執行多個程序也需要固定的開銷:程序的啟動時間,程序管理的資源消耗。

回到頂部

c++標準並沒有提供對多程序併發的原生支援,所以c++的多程序併發要靠其他api——這需要依賴相關平台。

c++11 標準提供了乙個新的執行緒庫,內容包括了管理執行緒、保護共享資料、執行緒間的同步操作、低階原子操作等各種類。標準極大地提高了程式的可移植性,以前的多執行緒依賴於具體的平台,而現在有了統一的介面進行實現。

c++11 新標準中引入了幾個標頭檔案來支援多執行緒程式設計:

我們從乙個hello開始。在單執行緒時:

1 # include2 using namespace std;

3 int main()

4 {5 cout<

1 # include2 # include3 using namespace std;

4 void hello()

5 {6 cout<

這就是我們編寫出的第乙個多執行緒的程式,一般來說並不值得為了如此簡單的任務而使用多執行緒,尤其是在這期間初始執行緒並沒做什麼。

**:

併發程式設計的藝術(一) 併發程式設計的挑戰

含義 cpu通過給每個執行緒分配cpu時間片實現多執行緒執行 當前任務執行乙個時間片後會切換下乙個任務,但切換前會儲存上乙個任務的狀態,從儲存到載入的過程就是一次上下文切換。但執行緒會有建立和上下文切換的開銷,所以多執行緒不一定快。減少上下文切換方法 無鎖併發程式設計 如id按hash演算法取模,不...

c 併發程式設計 01 併發與並行

並行 parallel 指在同一時刻,有多條指令在多個處理器上同時執行。所以無論從微觀還是從巨集觀來看,二者都是一起執行的。併發 concurrency 指在同一時刻只能有一條指令執行,但多個程序指令被快速的輪換執行,使得在巨集觀上具有多個程序同時執行的效果,但在微觀上並不是同時執行的,只是把時間分...

java併發程式設計(一) 併發程式設計需要注意問題

目錄 問題一上下文切換會帶來額外的開銷 執行緒的執行機制 什麼是上下文切換 上下文切換的過程 上下文切換是有開銷的 如何減少上下文切換 問題二併發不當可能會產生死鎖 什麼是死鎖 死鎖示例 如何避免死鎖 問題三計算機資源會限制併發 誤區執行緒越多速度越快 什麼是資源 如何解決資源的限制 併發是為了提公...