多執行緒程式開發簡介

2022-09-09 11:36:15 字數 3301 閱讀 7145

執行緒這個概念大概在2023年後才慢慢流行起來。執行緒是作業系統進行排程的最小單位,擁有少量的資源,如暫存器和棧。執行緒的特點是共享位址空間,從而高效地共享資料。多執行緒的價值是更好地發揮多核處理器的功能。

每個執行緒反覆地在資料系列集上執行同一種操作,並把操作結果傳遞給下一步驟的其他執行緒,這就是流水線方式

在流水線方式中,資料元素流序列地被一組執行緒順序處理。每個執行緒依次在每個元素上執行乙個特定的操作,並將結果傳遞給流水線中的下乙個執行緒。

每個執行緒在自己的資料上執行操作。工作組中的執行緒可能執行同樣的操作,也可能執行不同的操作,但是它們一定獨立地執行。

工作組模式中,資料由一組執行緒分別獨立處理。通常有兩種模式:simd(single instruction, multiple data, 單指令多資料流)和mimd(multiple instruction, multiple data, 多指令多資料)。simd是指所有的工作執行緒在不同的資料部分上執行相同的操作,mimd是指工作組中的執行緒在不同的資料上執行不同的操作。

乙個客戶端為每一件工作與乙個獨立的伺服器「訂契約」。通常「訂契約」是匿名的,乙個請求通過某種介面提交。

在客戶伺服器系統中,客戶端請求伺服器對一組資料執行某個操作。伺服器獨立地執行操作——客戶端或者等待伺服器執行,或者並行地執行,在後面需要時再查詢結果。

多執行緒程式設計具有如下優點:

在多處理器系統中開發程式的並行性。並行性這一優點需要特殊硬體支援,其他優點對硬體無要求。

在等待慢速外設i/o操作結束的同時,程式可以執行其他計算,為程式的併發提供更有效、更自然的開發方式。

一種模組化程式設計模型,能清晰地表達程式中獨立事件間的相互關係。

執行緒**中的負荷包括由於執行緒間同步所導致的直接影響。很多演算法在某些情況下可避免同步,但在幾乎任何執行緒**中都需要使用某種同步機制,同步很容易損失效能。

計算密集型執行緒數量若比可用的處理器多,則可能比單執行緒實現獲得更好的**結構,但程式效能也會更糟,這是由於多執行緒結構在要完成的工作上增加了同步和排程開銷,而可用的資源並沒有變。

執行緒模型基本思想簡單,但編寫能在多執行緒中良好工作的**需要認真思考和規劃,包括同步協議,避免死鎖、競爭和優先順序倒置。如果有可用的庫,應盡量使用庫**而不是自己編寫。

除錯不可避免的改變了事件的時序,這對於序列**問題不大,但對於非同步**卻是致命的。乙個執行緒因除錯陷阱而執行得慢了,要跟蹤的問題可能就不會出現,除錯無法再現的錯誤是一件讓人頭疼的事情。

從功能上講,沒有什麼是多執行緒能做到而單執行緒做不到的,反之亦然。

如果用很少的cpu負載就能讓io跑滿,或者用很少的io流量就能讓cpu跑滿,那麼多執行緒就沒有什麼優勢。

多執行緒的適用場景是:提高響應速度,讓io和「計算」相互重疊,降低延遲。雖然多執行緒不能提高絕對效能,但能提高平均響應效能。

乙個程式要寫成多執行緒,大致要滿足:

·有多個cpu可用,單核機器上多執行緒無效能優勢;

·執行緒間有共享資料,即記憶體中的全域性狀態;

·共享的資料是可以修改的; ·

·事件的響應有優先順序差異,可用專門執行緒處理高優先順序事件,防止優先順序反轉;

·延遲和吞吐量同樣重要,不是簡單的io密集或cpu密集型程式;

·利用非同步操作,如記日誌,無論發日誌訊息還是寫日誌檔案,都不應阻塞關鍵路徑;

·可擴充套件,乙個好的多執行緒程式應能享受增加cpu數目帶來的好處;

·多執行緒能有效地劃分責任與功能,讓每個執行緒的邏輯簡單,任務單一,便於編碼。

多執行緒常用程式設計模型有如下幾種:

·每個請求建立乙個執行緒,使用阻塞式io操作(伸縮性不佳);

·使用執行緒池,同樣使用阻塞式io操作;

·使用非阻塞io+io多路復用;

·leader/follower等高階模式;

此模型下,程式裡的每個io執行緒有乙個event loop(用作io多路復用),用於處理讀寫和定時時間。event loop代表了執行緒的主迴圈,需要讓哪個執行緒幹活,就把timer或io channel註冊到哪個執行緒的loop裡即可。

event loop描述如下:

while there are still events to process:

e = get the next event

if there is a callback associated with e:

call the callback

此模型會建立乙個執行緒池,每個執行緒有三種狀態:leading, following, processing。leader執行緒負責監聽請求,其他執行緒作為follower處於等待狀態,當leader收到請求後,首先通知乙個follower執行緒將其提拔為新的leader,然後自己去處理這個請求,處理完畢後加入follower執行緒等待佇列,等待下次成為leader。

leader/follower模式避免了執行緒動態建立和銷毀的額外開銷,將執行緒放在池中,無需交換資料,將上下文切換、同步、資料移動和動態記憶體管理的開銷都降到了最低。

event loop用作io多路復用,配合非阻塞io和定時器;執行緒池用作計算,可以是任務佇列或生產者消費者佇列。

執行緒無法給所有程式設計問題提供最好的解決方案。執行緒並不總是容易使用,也不能保證總是提供更好的效能。某些問題本身是非併發的,使用執行緒只能降低程式的效能並使程式複雜。大部分程式有一些本質上的併發,這種情況下,多執行緒程式通常比序列程式更快、響應效能更好,而且比實現同樣功能的非執行緒非同步程式更易於開發和維護。(張玉遵 | 天存資訊)

多執行緒程式開發簡介

執行緒這個概念大概在1993年後才慢慢流行起來。執行緒是作業系統進行排程的最小單位,擁有少量的資源,如暫存器和棧。執行緒的特點是共享位址空間,從而高效地共享資料。多執行緒的價值是更好地發揮多核處理器的功能。每個執行緒反覆地在資料系列集上執行同一種操作,並把操作結果傳遞給下一步驟的其他執行緒,這就是流...

iOS開發 多執行緒簡介

多執行緒從概念上理解是指從軟體或者硬體上實現多個執行緒併發執行的技術,簡單點理解就是同一時間可以執行多個事情 比如說一邊聽歌一邊碼 聽歌是乙個執行緒,碼 是乙個執行緒,如果是單核cpu的話,上面兩個動作其實可以確切的理解為併發,也就是偽並行,只是兩者相差的時間太快沒有察覺。電腦現在一般都是雙核的或者...

iOS開發 多執行緒簡介

多執行緒從概念上理解是指從軟體或者硬體上實現多個執行緒併發執行的技術,簡單點理解就是同一時間可以執行多個事情 比如說一邊聽歌一邊碼 聽歌是乙個執行緒,碼 是乙個執行緒,如果是單核cpu的話,上面兩個動作其實可以確切的理解為併發,也就是偽並行,只是兩者相差的時間太快沒有察覺。電腦現在一般都是雙核的或者...