多執行緒程式設計雜說2

2021-05-23 18:20:41 字數 1012 閱讀 6201

多執行緒程式設計普及出現在90年以後,之前只有多核的cpu伺服器才有這樣的需要。多執行緒以其複雜化脆弱性著稱,程式設計師大多避而不談或只是簡單的應用。執行緒保護的互斥鎖被認為是導致延遲和效能下降的主因。

這主要有兩方面的原因,第一大部分應用只需要乙個執行緒進行處理有著強烈的排他性和連貫性,第二很少有使用者應用是大規模併發的即使有大規模也是短時間,可以使用單執行緒排隊的方式也可以完美的解決。這樣絕大部的應用被拆成分程序方式的分布式和單執行緒的方式兩大塊,多執行緒程式設計就此沒落。多執行緒的方式有其不可替代的優勢,其比分布式在通訊方面的開銷要非常小,比單執行緒方式又充分發揮伺服器效能。好的多執行緒是能夠平衡的使用伺服器cpu資源,資料對cpu來說的透明的,按系統的cpu論片時間平均使用。多執行緒程式設計的難點是對資料的保護,劃分的不好或者不恰當都會導致效能瓶頸。這要求對應用有著非常充分的理解。資料分為全域性,執行緒內部,長量,變數等等。每種資料按邏輯應用的不同分別加以保護。例如執行緒相關的變數,只在某個執行緒使用的變數,可以不用加以保護。就現在程式語言來說還沒有非常合適多執行緒程式設計的語言,例如執行緒資料就沒有明顯的區分,如被其他的執行緒誤用也不會有編譯錯誤的提示,除錯也很困難。

當我們越來越依賴編譯器和語言來解決基礎錯誤的時候,多執行緒程式設計對工程師的要求可謂頗高。但其中還是有些規律和經驗可以使用。

例如對mutex鎖的應用可以把鎖排列優先順序,有1,2,3 三個互斥鎖,在巢狀使用的時候必須按1,2,3的次序使用。當第二個執行緒使用2,3時就會等待第一線程釋放第2個鎖。如何第一線程使用順序是1,2第二個執行緒使用是2,1很大的可能會造成第乙個執行緒拿到了鎖1等待鎖2,而第二線程拿到了鎖2等待鎖1。兩個執行緒就死鎖了。

再舉例說我們會把程式劃分成很多的函式,重複使用函式使**看起來更加的整潔,但在多執行緒程式設計中這點非常可怕。如果呼叫了很多層後,每一層的資料訪問又分別加鎖就很容易造成互斥鎖的巢狀。所以多執行緒程式設計中對函式層次的使用是扁平化的最多不過兩三層,把資料保護的部分盡量控制在一層之內。每次呼叫都有明確底層是否有互斥鎖,如果已經使用那麼上層就不能再使用。這點來說和物件程式語言重複使用函式追求有著嚴重的衝圖,很多時候我不得不把比較分散的幾個函式加鎖的資料訪問部分提取出來,再統一加乙個鎖以提高效率。

《Linux執行緒雜說》

在乙個程式中的多個執行線路就叫做執行緒 thread 執行緒是乙個程序內部的乙個控制序列。之所以出現執行緒,是因為程序的建立開銷比較大,當fork乙個子程序時,記憶體映像要從父程序複製到子程序,所有的描述符要在子程序中複製乙份,同時fork子程序後需要程序間通訊 ipc 實現父子程序中通訊。乙個程序...

多執行緒程式設計2

訊號量同步 include include include include include 訊號量函式定義 include void thread fun void arg sem t bin sem define worksize 1024 char workarea worksize int m...

多執行緒程式設計2

include include using namespace std 定義函式,可呼叫的物件。作為執行緒引數的入口 void myprint const int i,char pmybuf int main include include using namespace std void mypr...