(C++11/14/17學習筆記):併發基本概念及實現,程式、執行緒基本概念
目錄
併發基本概念及實現,程式、執行緒基本概念
併發、程式、執行緒的基本概念和綜述
併發
- 兩個或者更多的任務(獨立的活動)同時發生(進行):一個程式同時執行多個獨立的任務。
- 以往計算機,單核cpu(中央處理器)—— 某一個時刻只能執行一個任務:由作業系統排程,每秒鐘進行多次所謂的“任務切換”。
- 併發的假象(不是真正的併發),這種切換(上下文切換)是要有時間開銷的。
- 比如作業系統要儲存你切換時的各種狀態,執行進度等資訊,都需要時間,一會切換回來的時候要復原這些資訊。
- 硬體發展,出現了多處理器計算機:用於伺服器和高效能運算領域。
- 桌上型電腦:在一塊晶片上有多核(多個)cpu:雙核,4核,8核,10核......
- 能夠實現真正的並行執行多個任務(硬體併發)。
- 使用併發的原因:主要就是同時可以幹多個事,提高效能。
可執行程式
- 磁碟上的一個檔案:
- windows下, 一個副檔名為. exe的。
- linux( ls -la檢視), rwxrwxrwx (x執行杈限)。
程式
- 程式,就是一個可執行程式執行起來了,就叫建立了一個程式。
- 程式,就是處於執行狀態的可執行程式,是一個動態的概念。
執行緒
- 每個程式(執行起來的可執行程式),都有一個主執行緒,這個主執行緒是唯一的,也就是一個程式中只能有一個主執行緒,系統建立的。
- 當你執行要給可執行程式,產生了一個程式後,這個主執行緒就隨著這個程式黑默的啟動起來了。
- 比如執行一個程式,實際上是程式的主執行緒來執行(呼叫)這個main函式中的程式碼。
- 主執行緒與程式脣齒相依,有你必然有我,有我必然有你,沒有我必然沒有你。
- 執行緒:用來執行程式碼的。
- 執行緒這個東西理解成一條程式碼的執行通路(道路)。
- 除了主執行緒之外,我們可以通過自己寫程式碼來建立其他執行緒,其他執行緒走的是別的道路,甚至去不同的地方我每建立一個新執行緒,我就可以在同一個時刻,多幹一個不同的事(多走一條不同的程式碼執行路徑)。
- 多執行緒(併發)
- 執行緒並不是越多越好,每個執行緒,都需要一個獨立的堆疊空間(1M),執行緒之間的切換要儲存很多中間狀態。
- 切換會耗費本該屬於程式執行的時間。
總結執行緒
- 執行緒是用來執行程式碼的。
- 把執行緒這個東西理解成一條程式碼的執行通路(道路),一個新執行緒代表一條新的通路。
- 一個程式自動包含一個主執行緒,主執行緒隨著程式黑默黑默的啟動並執行,我們可以通過編碼來建立多個其他執行緒(非主執行緒)
- 但是建立的數量最大都不建議超過200-300個,至於到底多少個合適,在實際的專案中可以不斷調整和優化。
- 因為主執行緒是自動啟動的,所以一個程式中最少也是有一個執行緒(主執行緒)。程式和主執行緒感覺是參和兒子關係。
- 多執行緒程式可以同時幹多個事,所以執行效率高。但是到底有多高,並不是一個很容易評估和量化的東西。
- 仍舊需要在實際程式設計,實際專案中進行體會和調整優化。
併發的實現方法
- 兩個或者更多的任務(獨立的活動)同時發生(進行)實現併發的手段:
- 通過多個程式實現併發。
- 在單獨的程式中,我們建立多個執行緒來實現併發;自己寫程式碼來建立除了主執行緒之外的其他執行緒。
多程式併發
- 比如word啟動後就是程式,ie瀏覽器啟動後就是個程式。以及上面的案例賬號伺服器,遊戲邏輯伺服器,伺服器程式之間的通訊。
- 程式之間通訊(同一個電腦上:管道,檔案,訊息佇列,共享記憶體)。
- 不同電腦上:socket通訊技術。
多執行緒併發
- 多執行緒併發:單個程式中,建立了多個執行緒。
- 執行緒:感覺像輕量級的程式。每個執行緒都有自己獨立的執行路徑,但是一個程式中的所有執行緒共享地址空間(共享記憶體)。
- 全域性變數,指標,引用都可以線上程之間傳遞,所以,使用多執行緒開銷遠遠小於多程式。
- 共享記憶體帶來新問題,資料一致性問題。
- 多程式併發和多執行緒併發雖然可以混合使用,建議優先考慮多執行緒技術手段而不是多程式。
總結
- 和程式比,執行緒如下優點:
- 執行緒啟動速度更快,更輕量級。
- 系統資源開銷更少,執行速度更快,比如共享記憶體這種通訊方式比任何其他的通訊方式都快。
- 缺點:
- 使用有一定難度,要小心處理資料的一致性問題。
C++11新標準執行緒庫
- 以往:windows平臺:CreateThread(),_beginthred(),_beginthredeze)建立執行緒
- linux平臺:pthread_create():建立執行緒,涉及臨界區,互斥量等。
- 以往的多執行緒程式碼不能跨平臺。
- POSIX thread(pthread):跨平臺,但是需要做一番配置,所以用起來它也不是那麼方便。
- 從c++11新標準,C++語言本身增加對多執行緒的支援,意味著可移植性(跨平臺),大大減少開發量。
相關文章
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- 執行緒基本概念執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- 執行緒的基本概念執行緒
- 多執行緒基本概念執行緒
- (三)Java併發學習筆記–執行緒封閉Java筆記執行緒
- Linux程式執行緒學習筆記Linux執行緒筆記
- Java 併發程式設計學習筆記 05 :如何暫停執行緒?Java程式設計筆記執行緒
- 執行緒池的基本概念執行緒
- HTTP2基本概念學習筆記HTTP筆記
- H.264學習筆記——基本概念筆記
- 【kafka學習筆記】kafka的基本概念Kafka筆記
- .NET程式執行原理及基本概念詳解
- C++11併發程式設計:多執行緒std::threadC++程式設計執行緒thread
- 【C++11】c++11實現執行緒池C++執行緒
- Docker 學習筆記-基本概念與安裝Docker筆記
- Shiro學習筆記(一) 基本概念與使用筆記
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.2 Java多執行緒實現Java筆記執行緒程式設計
- 強化學習的基本概念與程式碼實現強化學習
- ElasticSearch 學習筆記(一) 基本概念與基本使用Elasticsearch筆記
- C++學習筆記-五大基本概念C++筆記
- Python學習筆記 - 多執行緒Python筆記執行緒
- Java 多執行緒學習筆記Java執行緒筆記
- Java 多執行緒基礎(一)基本概念Java執行緒
- java併發筆記之java執行緒模型Java筆記執行緒模型
- 【強化學習】強化學習的基本概念與程式碼實現強化學習
- 程式間通訊(linux程式與執行緒學習筆記)Linux執行緒筆記
- (C++11/14/17學習筆記):std::atomic續、std::async與std::thread對比C++筆記thread
- Java併發程式設計筆記6:執行緒池的使用Java程式設計筆記執行緒
- Redis學習筆記(01-基本概念及安裝)Redis筆記
- Zookeeper學習筆記(一)基本概念和簡單使用筆記
- python 學習筆記第四章:基本概念Python筆記
- Dubbo學習筆記(一)基本概念與簡單使用筆記
- 筆記:Elasticsearch基本概念筆記Elasticsearch
- 機器學習框架ML.NET學習筆記【1】基本概念機器學習框架筆記
- 【c++】c++11實現執行緒池C++執行緒
- Python學習筆記|Python之執行緒Python筆記執行緒
- Java多執行緒學習筆記(自用)Java執行緒筆記