多線程的優勢

多線程的優勢

盡管使用多線程有挑戰,但是由于使用多線程也有很多好處,我們仍然使用多線程。這些優勢(好處)是:

  • 更好的資源利用率
  • 在一些情景下更好的程序設計
  • 更具有響應性的程序

更好的資源利用率

想象有一個在文件系統中讀和處理文件的程序。如果從磁盤中讀一個文件需要使用5秒鐘,處理它需要使用2秒鐘。處理兩個文件就需要:

5秒鐘用于讀文件A
2秒鐘用于處理文件A
5秒鐘用于讀文件B
2秒鐘用于處理文件B
-------------------
共14秒

當cpu從磁盤中讀文件的時候,大部分的cpu時間被用于等待文件被磁盤中讀出(讀入內存)。cpu在這段時間其實是非常空閑的。它能夠做一些其他的事情。通過改變操作順序,cpu能夠被更好更有效率地利用。看一下下面這個順序。

5秒鐘用于讀文件A
5秒鐘用于讀文件B+2秒鐘用于處理文件A
2秒鐘用于處理文件B
------------------
共12秒

cpu先等待讀第一個文件。然后他開始讀第二個文件。當第二個文件正在被讀時,cpu處理了第一個文件。記住,當cpu等待文件從磁盤中被讀出時,cpu大部分時間都是空閑的。

一般來說,當cpu在等待IO的時候,cpu能夠做其他事情。不僅僅局限于磁盤IO。它也可以是網絡IO,或者也可以是用戶在機器上面的輸入。網絡和磁盤IO通常情況下要比cpu和內存IO要慢很多。

簡單的程序設計

如果你曾經在一個線程應用中親手編寫過上述順序的讀、處理程序,你需要跟蹤(記錄)文件的讀和處理兩種狀態。除了這個方法,你也可以開啟兩個線程,每一個線程僅僅只對一個文件進行讀和處理。每一個線程在等待磁盤讀指定的文件時,都會阻塞。當一個線程等待時,其他線程可以利用cpu去處理其他已經被讀入的文件部分。最后的結果是,磁盤一直保持忙碌狀態,讀入大量的文件到內存中。這種方法就可以有更高的利用率無論是對于磁盤還是CPU。而且這也容易去編程,因為每一個線程都只需要跟蹤單個文件即可。

更具有響應性的程序

另一個常見的目標用于轉換一個單線程應用到多線程應用是為了一個完成一個更多響應的程序。想象一個監聽著某些端口的服務端程序,服務于即將到來的請求。當請求被接收了之后,他處理了請求然后返回去繼續監聽。服務循環類似于下面這樣:

  while(server is active){
    listen for request
    process request
  }

如果請求需要很長時間來進行處理,沒有新的客戶端能夠發送請求到服務器中在這段時間內。僅僅只有服務器正在監聽的時候,請求能夠被接收。

另一個可替代的設計可以是監聽線程將請求傳遞給工作線程,然后立刻返回繼續監聽。工作線程將會處理請求然后發送一個回復到客戶端。這個設計類似于下面這樣:

  while(server is active){
    listen for request
    hand request to worker thread
  }

通過這種方法,服務將會馬上返回繼續監聽。這樣更多的客戶端能夠發送請求到服務端。服務端能夠變得更具有響應性。

這種情況和桌面程序是一樣的。如果你點了一個按鈕引發了一個長時間的任務,這個線程執行的任務是更新窗口,按鈕和其他...但是當這個任務執行時,這個應用將不會響應。換一種方式,任務可以交給工作線程。當工作線程忙于這個任務時,窗口線程能夠回應其他用戶的請求。當工作線程完成時,他會發送一個信號給窗口線程。這個窗口線程能夠用任務的結果來更新應用的界面。這種帶有工作線程設計的程序變得更具有響應性了。

翻譯自:Multithreading Benefits

ps:本人只是一個自學英語一段時間的初級程序猿。無論是英語翻譯程度,還是技術理解程度都遠遠不足,如果文中有翻譯不到位,或者技術理解錯誤情況,還請各位指出,必定改正,也可相互學習交流。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容