1. 程式人生 > >C++11 併發程式設計基礎(一):併發、並行與C++多執行緒

C++11 併發程式設計基礎(一):併發、並行與C++多執行緒

正文

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

回到頂部

1. 何為併發

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

這種次重點在計算機程式設計中,體現為某一個時刻只能處理一個操作

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

  • 併發:同一時間段內可以交替處理多個操作:

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

上看來,這個安檢視窗是同時處理這兩個佇列。

  • 並行:同一時刻內同時處理多個操作:

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

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

回到頂部

2.併發的基本方式途徑

多執行緒與多程序是併發的兩種途徑。
想象兩個場景:

  • 場景一:你和小夥伴要開發一個專案,但小夥伴們放寒假都回家了,你們只能通過QQ聊天、手機通話、傳送思維導圖等方式來進行交流,總之你們無法很方便地進行溝通。好處是你們各自工作時可以互不打擾。
  • 場景二:你和小夥伴放假都呆在學校實驗室中開發專案,你們可以聚在一起使用頭腦風暴,可以使用白板進行觀點的闡述,總之你們溝通變得更方便有效了。有點遺憾的是你在思考時可能有小夥伴過來問你問題,你受到了打擾。

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

2.1 多程序併發

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

2.2 多執行緒併發

在當個程序中執行多個執行緒也可以併發。執行緒就像輕量級的程序,每個執行緒相互獨立執行,但它們共享地址空間,所有執行緒訪問到的大部分資料如指標、物件引用或其他資料可以線上程之間進行傳遞,它們都可以訪問全域性變數。程序之間通常共享記憶體,但這種共享通常難以建立且難以管理,缺少執行緒間資料的保護。因此,在多執行緒程式設計中,我們必須確保每個執行緒鎖訪問到的資料是一致的。

回到頂部

3. C++中的併發與多執行緒

C++標準並沒有提供對多程序併發的原生支援,所以C++的多程序併發要靠其他API——這需要依賴相關平臺。
C++11 標準提供了一個新的執行緒庫,內容包括了管理執行緒、保護共享資料、執行緒間的同步操作、低階原子操作等各種類。標準極大地提高了程式的可移植性,以前的多執行緒依賴於具體的平臺,而現在有了統一的介面進行實現。

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

  • < thread > :包含std::thread類以及std::this_thread名稱空間。管理執行緒的函式和類在 中宣告.
  • < atomic > :包含std::atomic和std::atomic_flag類,以及一套C風格的原子型別和與C相容的原子操作的函式。
  • < mutex > :包含了與互斥量相關的類以及其他型別和函式
  • < future > :包含兩個Provider類(std::promise和std::package_task)和兩個Future類(std::future和std::shared_future)以及相關的型別和函式。
  • < condition_variable > :包含與條件變數相關的類,包括std::condition_variable和std::condition_variable_any。

3.1 初試多執行緒

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

1 # include<iostream>
2 using namespace std;
3 int main()
4 {
5     cout<<"hello world"<<endl;
6 }

在這裡,進行由一個執行緒組成,該執行緒的初始函式是main。我們啟動第二個執行緒來列印hello world:

 1 # include<iostream>
 2 # include<thread>
 3 using namespace std;
 4 void hello()
 5 {
 6     cout<<"hello world"<<endl;
 7 }
 8 int main()
 9 {
10     thread t (hello);
11     t.join();
12 }

在這裡,我們將列印hello world的語句放在函式hello中。每個執行緒都必須有一個初始函式,新執行緒的執行開始於初始函式。對於第一段程式來說,它的初始函式是main,對於我們新建立的執行緒,可以在std::thread()物件的建構函式中指定。
在第二段程式裡,程式由兩個執行緒組成:初始執行緒始於main,新執行緒始於hello。這裡將新執行緒t的初始函式指定為hello。
新執行緒啟動之後會與初始程序一併執行,初始執行緒可以等待或不等待新程序的執行結束——如果需要等待執行緒,則新執行緒例項需要使用join(),否則可以使用detach()。如果不等待新執行緒,則初始執行緒自顧自地執行到main()結束。
關於< thread > 我們將在下一篇中進行詳解。
由於我們的初始執行緒並沒有做什麼事情,啟動新執行緒後,新執行緒將打印出hello world。

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

在下一篇文章裡,我們將繼續探索< thread >標頭檔案的內容,編寫更復雜的併發程式。

相關推薦

C++11 併發程式設計基礎併發並行C++執行

正文 C++11標準在標準庫中為多執行緒提供了元件,這意味著使用C++編寫與平臺無關的多執行緒程式成為可能,而C++程式的可移植性也得到了有力的保證。另外,併發程式設計可提高應用的效能,這對對效能錙銖必較的C++程式設計師來說是值得關注的。 回到頂部 1. 何為併發 併發指的是兩個或多個獨立的活動在同

c++11 新特性實戰 執行操作

# c++11 新特性實戰 (一) ## c++11多執行緒操作 * 執行緒 * **thread** ```c++ int main() { thread t1(Test1); t1.join(); thread t2(Test2);

ElasticSearch筆記整理簡介REST安裝配置

大數據 ElasticSearch ELK [TOC] ElasticSearch簡介 ElasticSearch是一款基於Apache Lucene構建的開源搜索引擎,它采用Java編寫並使用Lucene構建索引、提供搜索功能,ElasticSearch的目標是讓全文搜索變得簡單,開發者可以通

ActiveAndroid 下載配置建立

專案地址:https://github.com/pardom/ActiveAndroid ActiveAndroid是一個輕量級的ORM框架,用ActiveAndroid能夠更快速地對資料庫進行增刪改查的操作(不用寫SQL語句),每一個數據記錄都可以通過save()和de

Android 圖片特效色相飽和度亮度

    平時的圖片在使用了美圖秀秀之後就會呈現不一樣的效果,就像上面的圖片展示的那樣(上圖是一張美圖秀秀的使用截圖)。實際上上面的效果離不開色彩的三要素——色相、飽和度和亮度。人眼看到的任一彩色光都是這三個特性的綜合效果。其中色調與光波的波長有直接關係,亮度

C程式設計基礎

參考書籍介紹 作業系統之哲學原理() C程式設計(譚浩強) 計算機網路(謝希仁) 微機原理(清華大學出版社) 高階資料結構 C語言基本資料型別、運算子與表示式 基本型別及其所佔位元組 short(短整型) :2個儲存單位 int (整型) :4個儲存單

Linux學習之shell 程式設計基礎

一、linux中經常和正則表示式聯合使用的工具 grep sed awk(自己去研究吧). 二,以grep為例,有以下正則操作 特殊符號彙總 特殊符號 代表意義 [:alnum:] 代表英文

程式設計規範C/C++的命名原則

無以規矩,不成方圓。 符合規範的統一命名是程式編寫的基本規矩之一。很多時候我們不願意接手別人的程式碼,原因之一就是程式碼命名很亂;我們自己寫程式碼時經常寫到後面忘了前面,也有可能是我們沒有養成規範的命名習慣。當寫程式碼成為一種藝術的美時,這種美的最直接的體現就

Java併發程式設計系列避免死鎖

避免死鎖 (1)避免一個執行緒同時獲取多個鎖 (2)避免一個執行緒在鎖內佔用多個資源,儘量保證每個鎖只佔用一個資源 (3)使用定時鎖,使用lock.trylock(timeout)替代內部鎖機制 (4)

linux網路程式設計基礎

 一、資料儲存順序:大端和小端          高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換       面試有時會出這麼個題:寫一個程式判

淺談Java併發程式設計系列—— 如何保證執行安全

執行緒安全類 保證類執行緒安全的措施: 不共享執行緒間的變數; 設定屬性變數為不可變變數; 每個共享的可變變數都使用一個確定的鎖保護; 保證執行緒安全的思路: 通過架構設計 通過

c++並發編程基礎並發並行線程

競爭 安全 開發 引用 詳解 輕量 事情 地址空間 var 正文 C++11標準在標準庫中為多線程提供了組件,這意味著使用C++編寫與平臺無關的多線程程序成為可能,而C++程序的可移植性也得到了有力的保證。另外,並發編程可提高應用的性能,這對對性能錙銖必較的C++程序員來

c++11正則表示式——匹配模式(pattern)

一、作用    pattern 是一個c++字串,它作用是給出一匹配規則,去檢測給定字串是否具備這種拼接規則。二、模式字串的語法規則      需要插入一句題外話,在特殊元字元中會用到\,對於c/c++而言它是個特殊字元,若我們需要一個“斜槓"時候需要   在其前面加一個\,

Java的高併發程式設計系列synchronized鎖

private int count = 10; public void test(){ synchronized (this) { //任何執行緒要執行下面的程式碼,必須先拿到Demo02物件例項的鎖 count --;

Java併發程式設計學習——標準Thread

1、雖然System.out.println內部是加了鎖的,但是如果System.out.println(i- -),依然是執行緒不安全的,因為有的JVM,i- -需要三步才能完成。 2、通過interrupt方法停止執行緒 public class Int

高階程式設計師需知的併發程式設計知識

## 併發程式設計簡介 併發程式設計式Java語言的重要特性之一,當然也是最難以掌握的內容。編寫可靠的併發程式是一項不小的挑戰。但是,作為程式設計師的我們,要變得更有價值,就需要啃一些硬骨頭了。因此,理解併發程式設計的基礎理論和程式設計實踐,讓自己變得更值錢吧。 ### 使用併發程式設計的優勢 #### 1

Python程式設計基礎程式語言是什麼?編譯型語言和解釋型語言的區別|Python是什麼?

程式語言是什麼? 其實,程式指的就是一系列指令,用來告訴計算機做什麼,而編寫程式的關鍵在於,我們需要用計算機可以理解的語言來提供這些指令。 雖然藉助 Siri(Apple)、Google Now(Android)、Cortana(Microsoft)等技術,我們可以使用漢語直接告訴計算機做什麼,比如“Siri

SQL夯實基礎inner joinouter join和cross join的區別

創建 color varchar mage bubuko where 是你 cross http 一、數據構建 先建表,再說話 create database Test use Test create table A ( AID int identity(1

Windows核心基礎許可權級別

許可權級別是CPU中的一個概念,CPU中包含4個許可權級別,分別是0環,1環,2環,3環,CPU設計製造商最初希望0環用於執行核心,1環和2環執行裝置驅動,3環執行應用程式,但是系統設計者為了簡單將驅動和核心都放在0環,應用程式放在3環,沒有使用1環和2環。後來CPU設計製造商乾脆

響應式程式設計系列什麼是響應式程式設計?reactor入門

響應式程式設計 系列文章目錄 (一)什麼是響應式程式設計?reactor入門 (二)Flux入門學習:流的概念,特性和基本操作 (三)Flux深入學習:流的高階特性和進階用法 (四)reactor-core響應式api如何測試和除錯? (五)Spring reactive: Spring WebFl