6.1、併發基本概念及實現,進程、執行緒基本概念

2020-08-12 11:11:34

併發、進程、執行緒的基本概念和綜述

併發,執行緒,進程的要求必須掌握;

1.1、併發

兩個或更多的任務(獨立的活動)同時發生(進行):一個程式同時執行多個獨立任務;
以往計算機,單核cpu(中英處理器):某一個時刻只能執行一個任務:由操作系統排程,每秒鐘進行多次所謂的「工作切換」。造成併發的假象(不是真正的併發);這種切換(上下文切換)是要有時間開銷的,比如操作系統要儲存你切換時的各種狀態,執行進度等資訊,都需要時間,一會切換回來的時候要復原這些資訊。

硬體發展,出現了多處理器計算機:用於伺服器和高效能運算領域。
臺式機:在一塊晶片上有多核(多個)CPU:雙核,4核,8核,10核。。。
能夠實現真正的並行執行多個任務(硬體併發);
使用併發的原因:主要就是同時可以幹多個事,提高效能;

1.2、可執行程式

磁碟上的一個檔案,windows下,一個擴充套件名爲.exe的。linux,ls -la, rwxrwxrwx(x執行許可權);

1.3 進程:大家已經知道了可執行程式是能夠執行。

windows下,雙擊一個可執行程式來執行。 linux下 ./檔名 ./a;
進程,就是一個可執行程式執行起來了,就叫建立了一個進程;
進程,就是執行起來了的可執行程式;
while(1){}

1.4、執行緒

a、每個進程(執行起來的可執行程式),都有一個主執行緒,這個主執行緒是唯一的,也就是一個進程中只能有一個主執行緒。
b、當你執行要給可執行程式,產生了一個進程後,這個主執行緒就隨着這個進程默默的啓動起來了;
ctrl+f5執行這個程式的時候,實際上是進程的主執行緒來執行(呼叫)這個main函數中的程式碼;
主執行緒與進程脣齒相依,有你必然有我,有我必然有你,沒有我必然沒有你;
執行緒:用來執行程式碼的;
執行緒這個東西理解成一條程式碼的執行通路(道路);
除了主執行緒之外,我們可以通過自己寫程式碼來建立其他執行緒,其他執行緒走的是別的道路,甚至去不同的地方
我每建立一個新執行緒,我就可以在同一時刻,多幹一個不同的事(多走一條不同的程式碼執行路徑);

多執行緒(併發)
執行緒並不是越多越好,每個執行緒,都需要一個獨立的堆疊空間(1M),執行緒之間的切換要儲存很多中間狀態;
切換會耗費本該屬於程式執行的時間;

總結執行緒:

a、執行緒是用來執行程式碼的;
b、把執行緒這個東西理解成一條程式碼的執行通路(道路),一個新執行緒代表一條新的通路。
c、一個進程自動包含一個主執行緒,主執行緒隨着進程默默的啓動並執行,我們可以通過編碼來建立多個其他執行緒(非主執行緒)但是建立的數量最大都不建議起來200-300個,至於到底多少個合適,大家在實際的專案中可以不斷調整和優化,有的時候執行緒太多效率反正會降低。
d、因爲主執行緒是自動啓動的,所以一個進程中最少也有一個執行緒(主執行緒)。進程和主執行緒感覺 是爹和兒子關係。
e、說白了:多執行緒程式可以同時幹多個事,所以執行效率高。但是到底有多高,並不是一個很容易評估的量化的東西。大家仍舊需要在實際程式設計,實際專案中進行體會和調整優化;

1.5、學習心得

開發多執行緒程式:實力的體現。一個是商用的必須需求;
執行緒開發有一定難度 。實際程式碼更復雜。理解上更難一些,需要一定的學習時間。
C++執行緒會涉及很多新概念,對於C++道路上的成長特別關鍵,不要急於求成;
想拿高薪。網路通訊,網路伺服器,網路方向。。。多執行緒是絕對繞不開的必須得學;

二:併發的實現方法

兩個或者更多的任務(獨立的活動)同時發生(進行)
實現併發的手段:
a、我們通過多個進程實現併發。
b、在單獨的進程中,我建立多個執行緒來實現併發;自己寫程式碼來建立除了主執行緒之外的其他執行緒;

2.1、多進程併發

word啓動後就是進程。ie瀏覽器啓動後就是個進程。
賬號伺服器,遊戲邏輯伺服器。伺服器進程之間的通訊。
進程之間通訊(同一個電腦上:管道,檔案,訊息佇列,共用記憶體);
不同電腦上:socket通訊技術;

2.2、多執行緒併發:單個進程中,建立了多個執行緒。
執行緒:感覺像輕量級的進程。每個執行緒都有自己獨立的執行路徑,但是一個進程中的所有執行緒共用地址空間(共用記憶體)。
全域性變數,指針,參照都可以線上程之間傳遞,所以:使用多執行緒開銷遠遠小於多進程。
共用記憶體帶來新問題,數據一致性問題’’;執行緒A,執行緒B;

多進程併發和多執行緒併發雖然可以混合使用,但建議優化考慮多執行緒技術手段而不是多進程;
在本章中只講多執行緒併發開發技術。後續談到併發,都指的是多執行緒併發。

2.3、總結

和進程比,執行緒有如下優點:
1、執行緒啓動速度快,更輕量級;
2、系統資源開銷更少,執行速度更快,比如共用記憶體這種通訊方式比任何其他的通訊方式都快;
缺點:
1、使用有一定難度,要小心處理數據的一致性問題;

三:C++11新標準執行緒庫

以往:windows:CreateThread(),_beginthread(),beginthreadexe()建立執行緒
linux:pthread_create()建立執行緒
臨界區,互斥量;
以往多執行緒程式碼不能跨平臺;
POSIX thread(pthread):跨平臺;做一番設定,所以用起來它也不是那麼方便。

從C++11新標準,C++語言本身增加了對多執行緒的支援,意味着可移植性(跨平臺),這大大減少開發人員工作量了;

即將講解C++11新標準多執行緒的寫法