天天看點

C++11 并發程式設計指南——前言

C++11 并發程式設計指南——前言

并發(concurrency)在我們的現實世界中随處可見,以至于我們常常忽略了它的存在,比方說你在工作(假設你是一名程式員,你的工作就是程式設計)的時候也可以聽聽自己喜歡的音樂,并且你的耳朵并不會因為手頭的工作而忽略了聲音的存在(當然,除非你自己有意的去忽略它,但你還是能夠聽得見聲音,隻是你的大腦可能不會去感受音樂的節奏),此時你的大腦既要控制你的雙手敲擊鍵盤,也要控制你的耳朵去感受音樂。是以,在一定程度上,你的大腦就在并發地處理不同的事情,并且每個時刻都可能會側重處理某件事情,比如某個時刻音樂達到高潮并且是你喜歡的旋律,你可能會放慢或者停止手邊的工作,但在另外一個時刻你正在編寫關鍵代碼,需要全神貫注來避免 bug 的出現,你可能會把聲音調小一點或者幹脆摘掉耳機。是以,我們的大腦就在并發地指導我們完成各種任務,或者換一種說法,我們需要處理的任務并發地征用我們的大腦,大腦就相當于計算機的 cpu,而待處理的任務就相當于計算機程式(更确切地說應該是程序或線程等執行實體)。

不過在現實世界中,我們并不會嚴格定義什麼是并發。而在計算機程式世界中,為了編寫高性能的代碼,我們應該了解什麼是并發,并發的基本特性是什麼,哪些問題可以使用并發程式設計來(高效地)解決,哪些情況下又應該盡量避免使用并發程式設計,我們在使用并發程式設計時需要注意一些什麼問題,本章的将會給大家介紹并發的基本概念,帶領大家學習并發程式設計的基本技巧。

與并發相近的另一個概念是并行(parallel)。和并發所描述的情況一樣,并行也是指兩個或多個任務被同時執行。但是嚴格來講,并發和并行的概念并是不等同的,兩者存在很大的差别。下面我們來看看計算機科學家們是怎麼區分并發和并行的。

erlang 是一種通用的并行程式設計語言,在并行、分布式和容錯等方面表現優異。下面是 erlang 官方的介紹:

erlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability. erlang’s runtime system has built-in support for concurrency, distribution and fault tolerance.
C++11 并發程式設計指南——前言

直覺來講,并發是兩個等待隊列中的人同時去競争一台咖啡機(當然,人是有理性懂禮貌的動物(也不排除某些很霸道的人插隊的可能),兩隊列中的排隊者也可能約定交替使用咖啡機,也可能是大家同時競争咖啡機,誰先競争到咖啡機誰使用,不過後一種的方法可能引發沖突,因為兩個隊列裡面排在隊列首位的人可能同時使用咖啡機),每個等待者在使用咖啡機之前不僅需要知道排在他前面那個人是否已經使用完了咖啡機,還需知道另一個隊列中排在首位的人是否也正準備使用咖啡機;而并行是每個隊列擁有自己的咖啡機,兩個隊列之間并沒有競争的關系,隊列中的某個排隊者隻需等待隊列前面的人使用完咖啡機,然後再輪到自己使用咖啡機。

是以,并發意味着多個執行實體(比方說上面例子中的人)可能需要競争資源(咖啡機),是以就不可避免帶來競争和同步的問題;而并行則是不同的執行實體擁有各自的資源,互相之間可能互不幹擾。

go 是一門新興的程式設計語言,go 官方對其介紹如下:

the go programming language is an open source project to make programmers more productive.go is expressive, concise, clean, and efficient. its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines.
concurrency is about dealing with lots of things at once. parallelism is about doing lots of things at once.

前者是關于程式結構的,而後者是關于程式執行的。rob 認為:

concurrency provides a way to structure a solution to solve a problem that may (but not necessarily) be parallelizable.
C++11 并發程式設計指南——前言

并行(parallelism)指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境下,并行性使多個程式同一時刻可在不同cpu上同時執行,如下圖所示:

C++11 并發程式設計指南——前言

是以,該文認為并發與并行的差別是:并發是一個處理器同時處理多個任務,而并行多個處理器或者是多核的處理器同時處理多個不同的任務。前者是邏輯上的同時發生(simultaneous),而後者是實體上的同時發生。而兩者的聯系是:并行的事件或活動一定是并發的,但反之并發的事件或活動未必是并行的。并行性是并發性的特例,而并發性是并行性的擴充(個人不贊同此觀點)。

本文主要講了什麼是并發以及并發和并行的聯系和差別。總得來說,joe armstrong 的觀點通俗易懂,rob pike 有關并發和并行的的觀點也很有意思。而關于并發和并行具體的差異,本文最後介紹了一種教科書式的解釋。讀者可以根據自己的了解來選擇認同上述某一種或幾種觀點。