1. 程式人生 > >【C++併發實戰】(一)併發基本概念

【C++併發實戰】(一)併發基本概念

 

什麼是併發

併發,最簡單的理解就是,兩個或者以上的活動同時進行。舉個比較實際的例子,你可以手腳並用,兩隻手做不同的動作等等。

在計算機中的“併發”,是指一個系統可以同時執行多個獨立的活動。在以前大多數計算機都只有一個處理單元(或者核心),這種計算機在同一時刻只能執行一個任務,任務只能一個一個的執行,但是這樣的計算機可以通過任務的高速切換來產生“併發”的假象。

在現如今,擁有多個處理器的計算機已經遍地都是,這些計算機可以真真正正的在同一時刻執行多個獨立的任務,這樣的被稱為“硬體併發”

多程序併發

多程序併發是指,存在多個單執行緒的程序,將應用程式分為多個,比如想要實現同時播放音樂和播放影像,那麼就分為兩個程序,一個程序播放音樂,另一個程序播放影像。

但是這樣有一個問題,比如你想要放一部電影,聲音和影像應該同步才對(沒人想看影音不同步的電影),那麼兩個程序之間為了實現播放電影就必須有所交流,那麼就涉及到程序間通訊,程序間的通訊方式就不多說了,各種各樣的通訊方式也有滿足不了需求的時候,比如同步複雜,速度慢造成延遲,更糟糕的是可能兩者都有。

看到這裡,可能會說速度很重要,多程序併發你可真是個小老弟。多程序併發存在的意義是什麼?它的優點是什麼?

多程序一個很大的優點就是程序間非常獨立,除了通訊之外基本不會互相影響,比如兩程序跑著跑著,一個程序突然死了,另一個程序別提傷心了,連看都不看一眼就繼續跑(可能比較極端,但是多程序的架構一個重要的角度就是安全),最有力的一個例子就是chrome瀏覽器,chrome瀏覽器採用多程序沙盒架構,為的就是當一個程序崩潰時不會影響主程序和其他程序。

多執行緒併發

併發的另一個途徑是單個程序中執行多個執行緒,執行緒在很多書中都被稱為“輕量級的程序”,每個執行緒可以相互獨立執行,但是程序中的所有執行緒都享有共同的地址空間,並且執行緒間擁有不少共享資料(那麼執行緒間同步和死鎖之類的概念就引出來了)。

那麼缺點就來了,執行緒間的同步並不簡單,是挺複雜的一個事情,並且加鎖之類的操作也有成本,會耗費一些資源

同時安全性問題也存在,比起多程序併發來說,多執行緒併發更像是四人三腳跑步,一個執行緒倒下了,其他三個可能也就完蛋了。

為什麼要使用併發

為了效能而使用併發

在同一時刻幹好幾個任務,肯定比一個一個任務執行來的快。

為了劃分關注點而使用併發

如果一場派對的舉辦都讓一個人幹,肯定會手忙腳亂,也不易於管理。任務也是一樣,又是讀檔案又是網路請求啥的,就算計算機比人的頭腦好一些,不會手忙腳亂,但是任務是要人來寫和管理的。一大鍋混在一起是很難進行管理的。

使用併發的一個目的就是為了將任務拆解,將關注點劃分開。易於管理。