不要過度迷戀多執行緒程式設計,它也許對你是個傳說

2021-10-04 21:59:14 字數 1469 閱讀 3034

結論:「多執行緒程式設計比序列程式設計編碼階段慢,執行效率不一定快」,聽到這個,是不是想放棄多執行緒,別急,繼續往下看。

併發:同乙個時間點,同時做多件事,但是每件事可能都做的不是那麼完美,可謂一心不可二用,例如我們吃東西的時候,可以看電視,但是有時候不是傻呵呵看電視入迷了,忘了吃東西,就是把東西塞到鼻孔裡了,從計算機的角度來說,就是你在聽歌的時候,可以玩遊戲,由於計算機的大腦比我們精明很多,腦子也比我們轉的快,所以一般不會出錯。

並行: 同乙個時間點,正在意義上的同時做多件事,好像是2個人一樣。就好像有2個一模一樣的的你,乙個在睡覺,乙個在學習,從計算機的角度來說,就是有2個大腦,乙個大腦指揮做一件事。

單核:cpu只有乙個運算核心,同乙個時間點只能做一件事。

多核(包含單核的ht, hyper-threading,也就是所謂的超執行緒,模擬多核):cpu有多個運算核心,類似於多個大腦。

併發和並行都可以歸為多執行緒的範疇。

效率,為了效率, 因為之前的序列程式設計,不能滿足個別場景的執行效率,所以有個多執行緒程式設計,那麼程式設計師如果不能搞清楚在什麼場景下,要使用多執行緒,那麼原因只有乙個:裝x ,裝x,裝x  重要的事情說三遍,但是想要玩好多執行緒程式設計也不是那麼容易,需要一定的技術功底,主要考慮乙個問題:執行緒安全 。所以裝x也需要一定的門檻......

單核

執行單執行緒:中規中矩,執行效率不一定低。

執行多執行緒:存在一定的上下文切換,特殊任務下,能提高系統的吞吐率。

多核

執行單執行緒:造成一定的硬體浪費,無法充分發揮硬體的效能,特殊任務下,能提高執行效率。

執行多執行緒:能夠發揮硬體的優勢,但是特殊任務下,不一定能提高執行效率,只能提高系統的吞吐能力。

計算機執行的任務無非有2大類: 計算密集型和io密集型。

計算密集型:有大量計算的任務,耗費的是cpu,例如數字的各種運算,對於圓周率3.14的計算,這種情況下,用多執行緒可以充分利用cpu,但是需要控制多執行緒的數量,數量過多容易造成上下文切換,執行效率下降,多執行緒的數量最好和核心數相當。

io密集型:對於io主要涉及到記憶體,磁碟,網路等儲存或者傳輸的任務,大部分的狀況是cpu在等i/o (硬碟/記憶體/網路) 的讀/寫操作,此時cpu loading並不高,這種情況下,利用多執行緒程式設計能提高系統的吞吐量 。

通過以上介紹,我們知道影響多執行緒的因素主要有: 任務型別和核心數,那麼我們可以得到以下使用場景(但是並不是絕對的,具體情況下具體分析):

1.如果是執行多個計算密集型任務

①單核:序列 > 並行,即是單執行緒》多執行緒

②多核:並行 > 序列,即是多執行緒》單執行緒

2.如果是執行多個io密集型任務:

①單核:並行 > 序列,即是多執行緒》單執行緒

②多核:並行 > 序列,即是多執行緒》單執行緒

不要盲目迷信多執行緒

最近閒來無事編寫了乙個非同步redis客戶端.為了測試其效能逐對redis和ssdb做了一次效能對比測試.首先介紹下測試環境,i5 4核心 3.6主頻的台式電腦器,伺服器客戶斷均執行在同一臺機器上.測試內容是1000條hashtable資料,分別有兩個屬性chianfo和skill,每個屬性存放10...

不要盲目迷信多執行緒

最近閒來無事編寫了乙個非同步redis客戶端.為了測試其效能逐對redis和ssdb做了一次效能對比測試.首先介紹下測試環境,i5 4核心 3.6主頻的台式電腦器,伺服器客戶斷均執行在同一臺機器上.測試內容是1000條hashtable資料,分別有兩個屬性chianfo和skill,每個屬性存放10...

多執行緒程式設計

1 多執行緒的基本思路不是在介面執行緒執行費時的 而是專門啟動乙個執行緒 稱作工作執行緒 來完成,介面執行緒只負責介面的 顯示 和操作,而工作執行緒只負責耗時的操作過程。2 對於普通的win32應用程式來說,執行緒可以分為兩種 介面 ui user inte ce 執行緒和工作執行緒。介面執行緒一般...