6-1 併發基本概念及實現,進程、線程基本概念

一、併發、進程、線程的基本概念和綜述

併發,線程,進程的要求必須掌握;

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新標準多線程的寫法。

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