[C++并發(fā)編程實(shí)戰(zhàn)]準(zhǔn)備篇

術(shù)語(yǔ)

并發(fā)(concurrency):兩個(gè)或兩個(gè)以上的任務(wù)在一段時(shí)間內(nèi)被執(zhí)行。我們不必care這些任務(wù)在某一個(gè)時(shí)間點(diǎn)是否是同時(shí)執(zhí)行距潘,可能同時(shí)執(zhí)行较锡,也可能不是器腋,我們只關(guān)心在一段時(shí)間內(nèi)月杉,哪怕是很短的時(shí)間(一秒或者兩秒)是否執(zhí)行解決了兩個(gè)或兩個(gè)以上任務(wù)。

并行(parallellism):兩個(gè)或兩個(gè)以上的任務(wù)在同一時(shí)刻被同時(shí)執(zhí)行抠艾。

并發(fā)說(shuō)的是邏輯上的概念苛萎,而并行,強(qiáng)調(diào)的是物理運(yùn)行狀態(tài)检号。并發(fā)“包含”并行腌歉。

計(jì)算機(jī)中的并發(fā):計(jì)算機(jī)領(lǐng)域里,并發(fā)不是一個(gè)新事物:很多年前齐苛,一臺(tái)單核計(jì)算機(jī)就能通過(guò)多任務(wù)操作系統(tǒng)的切換功能翘盖,同時(shí)運(yùn)行多個(gè)應(yīng)用程序;高端多處理器服務(wù)器在很早就已經(jīng)實(shí)現(xiàn)了真正的并行計(jì)算凹蜂。那“老東西”上有哪些“新東西”能讓它在計(jì)算機(jī)領(lǐng)域越來(lái)越流行呢馍驯?——真正任務(wù)并行,而非一種錯(cuò)覺玛痊。
圖1.1顯示了一個(gè)計(jì)算機(jī)處理恰好兩個(gè)任務(wù)時(shí)的理想情景汰瘫,每個(gè)任務(wù)被分為10個(gè)相等大小的塊。在一個(gè)雙核機(jī)器(具有兩個(gè)處理核心)上擂煞,每個(gè)任務(wù)可以在各自的處理核心上執(zhí)行混弥。在單核機(jī)器上做任務(wù)切換時(shí),每個(gè)任務(wù)的塊交織進(jìn)行对省。但它們中間有一小段分隔(圖中所示灰色分隔條的厚度大于雙核機(jī)器的分隔條);為了實(shí)現(xiàn)交織進(jìn)行蝗拿,系統(tǒng)每次從一個(gè)任務(wù)切換到另一個(gè)時(shí)都需要切換一次上下文(context switch)晾捏,任務(wù)切換也有時(shí)間開銷。進(jìn)行上下文的切換時(shí)哀托,操作系統(tǒng)必須為當(dāng)前運(yùn)行的任務(wù)保存CPU的狀態(tài)和指令指針惦辛,并計(jì)算出要切換到哪個(gè)任務(wù),并為即將切換到的任務(wù)重新加載處理器狀態(tài)萤捆。然后裙品,CPU可能要將新任務(wù)的指令和數(shù)據(jù)的內(nèi)存載入到緩存中,這會(huì)阻止CPU執(zhí)行任何指令俗或,從而造成的更多的延遲市怎。

圖 1.1 并發(fā)的兩種方式:雙核機(jī)器的真正并行 Vs. 單核機(jī)器的任務(wù)切換

圖1.2顯示了四個(gè)任務(wù)在雙核處理器上的任務(wù)切換,仍然是將任務(wù)整齊地劃分為同等大小塊的理想情況辛慰。實(shí)際上区匠,許多因素會(huì)使得分割不均和調(diào)度不規(guī)則。
圖 1.2 四個(gè)任務(wù)在兩個(gè)核心之間的切換

并發(fā)示例
試想當(dāng)兩個(gè)程序員在兩個(gè)獨(dú)立的辦公室一起做一個(gè)軟件項(xiàng)目帅腌,他們可以安靜地工作驰弄、不互相干擾,并且他們?nèi)耸忠惶讌⒖际謨?cè)速客。但是戚篙,他們溝通起來(lái)就有些困難,比起可以直接互相交談溺职,他們必須使用電話岔擂、電子郵件或到對(duì)方的辦公室進(jìn)行直接交流。并且浪耘,管理兩個(gè)辦公室需要有一定的經(jīng)費(fèi)支出乱灵,還需要購(gòu)買多份參考手冊(cè)。
假設(shè)七冲,讓開發(fā)人員同在一間辦公室辦公痛倚,他們可以自由的對(duì)某個(gè)應(yīng)用程序設(shè)計(jì)進(jìn)行討論,也可以在紙或白板上輕易的繪制圖表澜躺,對(duì)設(shè)計(jì)觀點(diǎn)進(jìn)行輔助性闡釋〔跷龋現(xiàn)在,你只需要管理一個(gè)辦公室苗踪,只要有一套參考資料就夠了颠区。遺憾的是,開發(fā)人員可能難以集中注意力通铲,并且還可能存在資源共享的問(wèn)題(比如毕莱,“參考手冊(cè)哪去了?”)
以上兩種方法,描繪了并發(fā)的兩種基本途徑。每個(gè)開發(fā)人員代表一個(gè)線程朋截,每個(gè)辦公室代表一個(gè)處理器蛹稍。第一種途徑是有多個(gè)單線程的進(jìn)程,這就類似讓每個(gè)開發(fā)人員擁有自己的辦公室部服,而第二種途徑是在單一進(jìn)程里有多個(gè)線程唆姐,如同一個(gè)辦公室里有兩個(gè)開發(fā)人員。讓我們?cè)谝粋€(gè)應(yīng)用程序中簡(jiǎn)單的分析一下這兩種途徑廓八。

并發(fā)方式

  • 多進(jìn)程
  • 多線程

并發(fā)時(shí)機(jī)

  • 分離關(guān)注點(diǎn)
    通過(guò)將相關(guān)的代碼與無(wú)關(guān)的代碼分離奉芦,可以使程序更容易理解和測(cè)試,從而減少出錯(cuò)的可能性剧蹂。
  • 為了性能兩種方式利用并發(fā)提高性能:第一声功,將一個(gè)單個(gè)任務(wù)分成幾部分,且各自并行運(yùn)行宠叼,從而降低總運(yùn)行時(shí)間先巴。這就是任務(wù)并行(task parallelism)。雖然這聽起來(lái)很直觀冒冬,但它是一個(gè)相當(dāng)復(fù)雜的過(guò)程伸蚯,因?yàn)樵诟鱾€(gè)部分之間可能存在著依賴。區(qū)別可能是在過(guò)程方面——一個(gè)線程執(zhí)行算法的一部分简烤,而另一個(gè)線程執(zhí)行算法的另一個(gè)部分——或是在數(shù)據(jù)方面——每個(gè)線程在不同的數(shù)據(jù)部分上執(zhí)行相同的操作(第二種方式)剂邮。后一種方法被稱為數(shù)據(jù)并行(data parallelism)。

實(shí)現(xiàn)并發(fā)

線程

線程thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度和分派的最小單位横侦。它被包含在進(jìn)程之中抗斤,是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)線程指的是進(jìn)程中一個(gè)單一順序的控制流丈咐,一個(gè)進(jìn)程中可以并行多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)龙宏。

同一進(jìn)程中的多條線程將共享該進(jìn)程中的全部系統(tǒng)資源棵逊,如虛擬地址空間,文件描述符信號(hào)處理等等银酗。但同一進(jìn)程中的多個(gè)線程有各自的調(diào)用棧(call stack)辆影,自己的寄存器環(huán)境(register context),自己的線程本地存儲(chǔ)(thread-local storage)黍特。

一個(gè)進(jìn)程可以有很多線程蛙讥,每個(gè)線程并行執(zhí)行不同的任務(wù),每個(gè)進(jìn)程至少有一個(gè)線程灭衷,在程序啟動(dòng)時(shí)由系統(tǒng)創(chuàng)建次慢,此線程被稱為主線程,負(fù)責(zé)程序主流程;在GUI程序中迫像,也叫做UI線程劈愚,負(fù)責(zé)主流程消息循環(huán),界面刷新和重繪動(dòng)作闻妓。

在多核或多CPU菌羽,或支持Hyper-threading的CPU上使用多線程程序設(shè)計(jì)的好處是顯而易見,即提高了程序的執(zhí)行吞吐率由缆。在單CPU單核的計(jì)算機(jī)上注祖,使用多線程技術(shù),也可以把進(jìn)程中負(fù)責(zé)IO處理均唉、人機(jī)交互而常被阻塞的部分與密集計(jì)算的部分分開來(lái)執(zhí)行是晨,編寫專門的workhorse線程執(zhí)行密集計(jì)算,從而提高了程序的執(zhí)行效率浸卦。

OpenMP

OpenMP(Open Multi-Processing)是一套支持跨平臺(tái)共享內(nèi)存方式的多線程并發(fā)的編程API署鸡,使用C,C++Fortran語(yǔ)言,可以在大多數(shù)的處理器體系和操作系統(tǒng)中運(yùn)行限嫌,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows靴庆。包括一套編譯器指令、庫(kù)和一些能夠影響運(yùn)行行為的環(huán)境變量怒医。

MPI

消息傳遞界面/接口(Message Passing Interface炉抒,縮寫MPI)是一個(gè)并行計(jì)算應(yīng)用程序接口(API),常在超級(jí)電腦稚叹、電腦簇等非共享內(nèi)存環(huán)境程序設(shè)計(jì)焰薄。

PPL

PPL(Parallel Patterns Library, 并行模式庫(kù)) 提供命令式編程模型,以促進(jìn)開發(fā)并發(fā)應(yīng)用程序的可擴(kuò)展性和易用性扒袖。 PPL 構(gòu)建在并發(fā)運(yùn)行時(shí)的計(jì)劃和資源管理組件上塞茅。 通過(guò)提供并行作用于數(shù)據(jù)的泛型安全算法和容器,提高應(yīng)用程序代碼與基礎(chǔ)線程機(jī)制之間的抽象級(jí)別季率。 使用 PPL 還可以開發(fā)通過(guò)為共享狀態(tài)提供替代方案實(shí)現(xiàn)縮放的應(yīng)用程序野瘦。

PPL 提供以下功能:

  • 任務(wù)并行︰ 一種機(jī)制,在 threadpool Windows 來(lái)并行執(zhí)行多個(gè)工作項(xiàng) (任務(wù)) 的工作原理

  • 并行算法︰ 在并發(fā)運(yùn)行時(shí)執(zhí)行操作的基礎(chǔ)上從事并行中的數(shù)據(jù)集合的泛型算法

  • 并行容器和對(duì)象︰ 提供對(duì)其元素的安全并發(fā)訪問(wèn)的泛型容器類型

【參考資料】
OpenMP 入門教程
【并行計(jì)算】用MPI進(jìn)行分布式內(nèi)存編程(一)
【下一篇】
[C++并發(fā)編程實(shí)戰(zhàn)]創(chuàng)建多線程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末飒泻,一起剝皮案震驚了整個(gè)濱河市鞭光,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泞遗,老刑警劉巖惰许,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異史辙,居然都是意外死亡汹买,警方通過(guò)查閱死者的電腦和手機(jī)佩伤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卦睹,“玉大人畦戒,你說(shuō)我怎么就攤上這事〗嵝颍” “怎么了障斋?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)徐鹤。 經(jīng)常有香客問(wèn)我垃环,道長(zhǎng),這世上最難降的妖魔是什么返敬? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任遂庄,我火速辦了婚禮,結(jié)果婚禮上劲赠,老公的妹妹穿的比我還像新娘涛目。我一直安慰自己,他們只是感情好凛澎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布霹肝。 她就那樣靜靜地躺著,像睡著了一般塑煎。 火紅的嫁衣襯著肌膚如雪沫换。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天最铁,我揣著相機(jī)與錄音讯赏,去河邊找鬼。 笑死冷尉,一個(gè)胖子當(dāng)著我的面吹牛漱挎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雀哨,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼识樱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了震束?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤当犯,失蹤者是張志新(化名)和其女友劉穎垢村,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚎卫,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘉栓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宏榕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侵佃。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡麻昼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馋辈,到底是詐尸還是另有隱情抚芦,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布迈螟,位于F島的核電站叉抡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏答毫。R本人自食惡果不足惜褥民,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洗搂。 院中可真熱鬧消返,春花似錦、人聲如沸耘拇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驼鞭。三九已至秦驯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挣棕,已是汗流浹背译隘。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洛心,地道東北人固耘。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像词身,于是被迫代替她去往敵國(guó)和親厅目。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355