目錄
1、併發、線程、進程的概念
1.1併發
兩個或者多個任務(獨立的活動)同時發生:一個程序同時執行多個獨立的任務;
單核CPU的計算機在某一個時刻只能執行一個任務,由操作系統調度,進行多次的“任務切換”,產生併發的假象(不是真正的併發);這種切換是要有時間開銷的,比如操作系統要保存切換時的各種狀、執行進度等信息,切換回來時要復原這些信息。
隨着硬件的發展,出現了多處理器計算機(用於服務器和高性能計算領域);臺式機:在一塊芯片上有多核,能夠實現真正的並行執行多個任務(硬件併發)。
使用併發的動機:主要就是同時可以幹多個事,提高性能。
1.2可執行程序
磁盤上的一個文件,如windovs下一個擴展名爲.exe。
1.3進程
運行起來的可執行程序,一個可執行程序運行起來了,就創建了一個進程。
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多線程併發
單個進程中,創建了多個線程
線程:輕量級的進程。每個線程都有自己獨立的運行路徑,但是一個進程中的所有線程共享地址空間(共享內存)。
全局變量,指針,引用都可以在線程之間傳遞;所以,使用多線程開銷遠遠小於多進程。
共享內存帶來新問題,數據一致性問題;
多進程併發和多線程併發雖然可以混合使用,但建議,優先考慮多線程技術手段而不是多進程。
本章中,只講多線程併發開發技術,後續談到的併發,都只的是多線程併發。
2.3總結
和進程比,線程如下優點:
(1)線程啓動速度更快,更輕量級
(2)系統資源開銷更少,執行速度更快,比如共享內存這種通信方式比任何其他的通信方式都快;
缺點:使用有一定難度,要小心處理據的一致性問題。
三、C++11新標準線程庫
windows可以通過createThread()、_beginthred(),_beginthredexe()創建線程;linux:pthread_create()創建線程;但是這種多線程代碼不能跨平臺。
通過POSIX(pthread)庫跨平臺;需要做一番配置,所以用起來它也很不方便。
從C++11新標準,C++語言本身增加對多線程的支持,意味着可移植性(跨平臺),這大大減少開發人員工作量了。
注:該文是C++11併發多線程視頻教程筆記,詳情可學習:https://study.163.com/course/courseMain.htm?courseId=1006067356