(C++11/14/17學習筆記):併發基本概念及實現,程式、執行緒基本概念

Asinmy發表於2020-12-08

目錄

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

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

併發

可執行程式

程式

執行緒

總結執行緒

併發的實現方法

多程式併發

多執行緒併發

總結

C++11新標準執行緒庫

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

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

併發

  • 兩個或者更多的任務(獨立的活動)同時發生(進行):一個程式同時執行多個獨立的任務。
  • 以往計算機,單核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++語言本身增加對多執行緒的支援,意味著可移植性(跨平臺),大大減少開發量。

相關文章