什麼是多執行緒?
單任務,單cpu時代,一個時間點僅能執行單一程式,程式可以獨佔資源.
多工,單cpu時代,一個時間點能夠執行多個程式,程式必須共享資源.然而這並不是真正意義上的執行多個程式.而是統一由作業系統為多個程式分配cpu執行時間片,讓cpu在不同的任務中切換執行.
多工,單cpu對開發者設計軟體時提出了新的挑戰,即假設程式不使用計算機資源後需要立即釋放資源,以供其他程式使用,提升計算機資源利用率.
而後發展至多執行緒技術,即讓一個程式內部擁有多個執行緒並行執行,並行程度取決於cpu的核心以及執行緒數量.不同的執行緒有可能被分配到不同的cpu上執行,因此一個程式執行在多執行緒下,即能夠被多個cpu同時執行.
多cpu多執行緒相較於多工對開發者設計軟體時提出了更加苛刻的挑戰,多執行緒帶來的問題在以往單cpu時代聞所未聞.多執行緒在同一程式內並行執行,造成比較直觀的問題是會產生併發的讀寫操作,且順序隨機,對其產生的輸出結果完全無法預估.
併發的讀寫問題僅會在一個讀一個寫或兩個寫操作並行執行的場景下產生.如一個執行緒往記憶體中讀取數值,另一個執行緒往記憶體中寫數值,兩個執行緒執行完畢後無法預估讀執行緒讀取到的數值到底是更新前的數值還是更新後的數值,或是兩個數值的混合體.兩個寫操作也同樣如此,是第一個寫操作寫入的值還是第二個寫操作寫入的值,或是兩個寫操作的混合值.
多執行緒的優點
通常網路/磁碟io比cpu和記憶體運算慢得多,利用這一點,可以在程式等待io時,儘可能的利用cpu做其他事情,提升資源利用率.
對沒有狀態共享行為的任務,多執行緒有利於編寫處理程式和提升處理速度.如對多個文字檔案中的相同字元出現次數進行統計,可以利用多執行緒對多個文字檔案分別進行統計再累計所有執行緒統計出來的數目得到最終的統計值.
利用多執行緒可以設計出響應速度更快的程式.對於擁有介面的應用,可以利用1+n的執行緒模式,讓一個執行緒負責響應介面事件和接收事件處理結果,多個介面事件將線上程池中去處理,處理完畢後再將結果傳遞給介面執行緒.以此來達到提升程式響應速度的效果.
多執行緒的缺點
tips: 應該多測量一下應用程式的效能和響應能力(硬體效能+軟體效能綜合決定了應用的效能,軟體效能對應用綜合效能的影響較大).
多執行緒在涉及到狀態共享時,對程式的設計將變得十分複雜.需要對程式施加一定的同步措施,且不正確的同步措施將會帶來不可預期的結果,所以對開發人員多執行緒程式設計技能的掌握程度要求較高.
多執行緒的切換一定程度上需要更換本地的上下文資料,即在執行下一個執行緒時需要暫存上一個執行緒的執行資料.頻繁的上下文切換必然會造成資源浪費.如無必要,儘量不讓執行緒進行上下文切換.
計算機中讓多個執行緒保持活躍必然需要一定的資源,即需要一定的記憶體來維持每個執行緒的堆疊資訊.也需要作業系統調配一定的資源來管理執行緒.大量無用且活躍的執行緒會佔用大量的計算機資源.