C++日記——Day35:併發基本概念及實現,進程、線程基本概念

併發、進程、線程的基本概念

併發

兩個或者更多的任務(獨立的事情)同時進行;

一個程序同時執行多個獨立的任務;

以往計算機只有單核cpu,某一時刻只能執行一個任務:有操作系統調度,每秒鐘進行多次所謂的“任務切換”。不是真正的併發,屬於併發的假象;這種切換(上下文切換)是要有時間開銷的,比如操作系統要保存你切換時的各種狀態,執行進度等信息,都需要時間一會兒切換回來時需要復原這些信息。

 

硬件發展,出現了多處理器計算機:用於服務器和高性能計算領域。

臺式機:在一塊芯片上有多核cpu,4核,8核,10核

能夠實現真正的並行執行多個任務(硬件併發);

 

使用併發的原因:同時幹多個事情,提高性能;

 

可執行程序

磁盤上的一個文件,windows下,.exe文件,Linux下,執行權限帶x的文件。

 

進程

一個可執行程序運行起來,就是一個進程。

進程就是運行起來的可執行程序;

 

線程

每個進程(執行起來的可執行程序),都有一個主線程,這個主線程是惟一的,也就是一個進程中只能有一個主線程

當你執行可執行程序,產生一個進程後,這個主線程就隨着這個進程默默啓動起來了。

運行這個程序的時候實際上是進程的主線程來調用main 函數中的代碼。

主線程與進程脣齒相依。

線程:執行代碼的;線程可以理解成一條代碼的執行通路。

 

除了主線程之外,我們可以通過自己寫代碼來創建其它線程,其它線程走的是別的道路。每創建一個新線程,我們就可以在同一時刻,多幹一個不同的事情,

 

 

多線程

線程並不是越多越好,每個線程都需要一個獨立的堆棧空間(1MB),線程之間切換要保存很多中間狀態

切換會耗費本該屬於程序運行的時間

 

總結線程:

1、線程是用來執行代碼的

2、把線程理解成一條代碼的執行通路,一個新新線程代表一個新通路。

3、一個進程自動包含一個主線程,主線程隨着進程默默啓並運行,我們可以通過編碼來創建多個其它線程。但是創建的數量最大都不建議超過200-300個,至於多少個合適,大家可以在實際項目中不斷調整優化。有的時候線程太多效率反而降低

4、因爲主線程是自動啓動的,所以一個進程中最少也是有一個線程(主線程)的。

5、說白了,多線程程序,可以同時幹多個事情,所以運行效率高。但是到底有多高,並不是一個很容易評估和量化的東西。

 

併發的實現方法

兩個或者更多任務(獨立任務)同時發生

實現併發的手段:

1、我們通過過個進程實現併發;

2、在單獨的進程中,我創建多個線程來實現併發;自己寫代碼來創建除主線程之外的其它線程

 

多進程併發:

如賬號服務器,遊戲邏輯服務器。

服務器進程之間的通訊

進程之間通訊:同一個電腦上:管道;文件;消息隊列;共享內存;

                        不通電腦:socket通信

 

多線程併發:

在單個進程中,創建了多個線程

線程:像是輕量級的進程,每個進程都有自己的運行路徑,但是一個進程中所有的線程共享地址空間(共享內存),全局標量,指針,引用 都可以在線程之間傳遞;所以,使用多線程開銷遠遠小於多進程

共享內存帶來了一個新問題,數據一致性問題;

 

多進程併發和多進程併發雖然可以混合使用,但是建議,優先考慮多線程技術而不是多進程;

 

 

總結

和進程比線程有如下有點:

1、線程啓動速度更快,更輕量;

2、系統資源開銷少,執行速度更快,比如共享內存這種通訊方式比其他任何通訊方式都快

缺點:

使用有難度

 

C++11線程庫:

以往的多線程代碼不能跨平臺。

POSIX thread:跨平臺,但是需要額外配置。

從C++11開始,C++本身增加了對多線程的支持,意味着可移植性;

 

 

 

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