Concurrecy vs. Parallelism:C++ Concurrency In Action 2nd 的作者與衆不同的觀點

一、引言

最近在學習《C++ Concurrency In Action 2nd》這本書,作者在本書一開頭使用了大量的篇幅舉了一個例子:

想象有一個場景,在一家 IT 公司裏,有兩個程序員分爲 A 和 B。會有這麼兩種工作的分配情況:

  1. A 和 B 分別擁有一個辦公室,有自己的參考手冊。他們自己單獨工作,交流通過電話、郵件,或者直接步行到另一個程序員的辦公室裏
  2. A 和 B 同時在一個辦公室,只有一份參考手冊。他們在一起工作,可以非常方便的交流,但是參考手冊可能就會出現有時候找不到的情況

這個例子非常的簡單,但是卻隱喻了實現併發的兩種方式。其中辦公室隱喻進程,參考手冊隱喻進程內的資源,A 和 B 分別意味着線程。實現併發有兩種方式,一種就是兩個進程,進程間通信(socket、pipe、signal 等等方式);另一種就是多線程。

作者花了這麼長的時間闡述這個例子拋磚引玉,一方面爲了讓讀者瞭解什麼是併發(Concurrency),讓讀者搞清楚多線程(Multithreading)與併發的關係(多線程並不是實現併發的唯一方法);另一方面,就是爲了引出下一個話題:

併發(Concurrency)與並行(Parallelism)的區別是什麼?

關於這個問題,我也曾經在網上搜過。網上的博客往往能夠就這個問題討論出非常大的篇幅,可以說各自有各自的說法。

但是至少,學習 C++ 的人有福氣了。《C++ Concurrency In Action 2nd》的作者在書中給出了他自己的見解。這裏,我也非常開心的能夠將作者的思想分享到博客中,就算你不太認同作者的觀點,至少在談論這個問題的時候,你還能想到有人確實是這麼認爲的。

二、C++ Concurrency In Action 2nd 作者的觀點

這裏,我直接先貼上作者的原文:

Concurrency and parallelism have largely overlapping meanings with respect to multithreaded code. Indeed,to many they mean the same thing. The difference is primarily a matter of nuance, focus, and intent. Both terms are about running multiple tasks simultaneously, using the available hardware, but parallelism is much more performance-oriented.

這裏簡單翻譯一下:

併發和並行在多線程編程的領域中有太多地方有着重疊的含義。實際上,在很多地方他們有着同樣的含義。兩者的區別主要是細微的區別,比如說關注點上、目的上。這兩個術語都意爲在可用硬件上同時地運行多個任務,不同的地方在於並行更加的關注性能。

作者這裏提到,併發和並行並無太大的區別,兩者實際上很多地方含義重疊。兩者的區別非常的細微,並行更加註重性能上的含義。

接下來,作者舉了一個非常形象的例子:

People talk about parallelism when their primary concern is taking advantage of the available hardware to increase the performance of bulk data processing, whereas people talk about concurrency where their primary concern is separation of concerns, or responsiveness.

簡單翻譯一下:

人們在提到並行的時候,關心的是如何在可用硬件上去提高大量數據的處理性能,而談到併發的時候,則更關心分離的含義,或者說程序的響應能力。

簡單來說,作者認爲併發更加註重分離的含義,而並行更加註重性能。

以上,就是《C++ Concurrency In Action 2nd》的作者對於併發(Concurrency)和並行(Parallelism)二者區別的觀點。

三、網上普遍的觀點

有趣的事情是,如果你嘗試在網上搜索 “併發與並行的區別”,你會發現有一種主流的認知,那就是(引用自知乎最高贊答案):

你喫飯喫到一半,電話來了,你一直到喫完了以後纔去接,這就說明你不支持併發也不支持並行。
你喫飯喫到一半,電話來了,你停了下來接了電話,接完後繼續喫飯,這說明你支持併發。
你喫飯喫到一半,電話來了,你一邊打電話一邊喫飯,這說明你支持並行。併發的關鍵是你有處理多個任務的能力,不一定要同時。

並行的關鍵是你有同時處理多個任務的能力。所以我認爲它們最關鍵的點就是:是否是『同時』。
作者:「已註銷」
鏈接:https://www.zhihu.com/question/33515481/answer/58849148
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

這種觀點的關鍵點在於,併發有一個隊列的含義,即使當前不能處理完事務,也要在之後能夠完成,也就是重在能完成;並行則一定要支持同時完成,就是在你接到這個任務的時候就要能夠着手去做他。

也就是這個知乎答主所說的,關鍵點在於是否是 “同時”。

那麼這一個觀點是否意味着 《C++ Concurrency In Action 2nd》作者的認爲是錯誤的了呢?

我覺得也不然,就像作者所說的,併發更加註重分離的行爲,並行更加註重性能。其實與網上這種普遍的認知也是暗合的。

三、總結

併發與並行的區別這個問題,網上有太多的聲音,各有各的想法。有些人覺得併發是邏輯上的設計模式,是能夠處理多個任務的一種方式;認爲並行則是同時在做多個事情。

而 《C++ Concurrency In Action 2nd》作者認爲,併發與並行實際上已經有太多重疊的含義了,只有細微的差別而已,併發更加註重於分離的行爲的本身,或者響應能力;並行則更加註重提高性能相關的方面。

至於哪種觀點是對的,取決於你自己的判斷。

畢竟我們也不是學院派的那羣老學究,對於我們普通的程序員來說,集思廣益,有自己的見解是最好的了:)

希望本篇博客能夠對你有一些幫助~~~
To be Stronger:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章