多線程的優(yōu)勢

多線程的優(yōu)勢

盡管使用多線程有挑戰(zhàn),但是由于使用多線程也有很多好處,我們?nèi)匀皇褂枚嗑€程。這些優(yōu)勢(好處)是:

  • 更好的資源利用率
  • 在一些情景下更好的程序設(shè)計(jì)
  • 更具有響應(yīng)性的程序

更好的資源利用率

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

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

當(dāng)cpu從磁盤中讀文件的時候,大部分的cpu時間被用于等待文件被磁盤中讀出(讀入內(nèi)存)。cpu在這段時間其實(shí)是非??臻e的。它能夠做一些其他的事情。通過改變操作順序,cpu能夠被更好更有效率地利用??匆幌孪旅孢@個順序。

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

cpu先等待讀第一個文件。然后他開始讀第二個文件。當(dāng)?shù)诙€文件正在被讀時,cpu處理了第一個文件。記住,當(dāng)cpu等待文件從磁盤中被讀出時,cpu大部分時間都是空閑的。

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

簡單的程序設(shè)計(jì)

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

更具有響應(yīng)性的程序

另一個常見的目標(biāo)用于轉(zhuǎn)換一個單線程應(yīng)用到多線程應(yīng)用是為了一個完成一個更多響應(yīng)的程序。想象一個監(jiān)聽著某些端口的服務(wù)端程序,服務(wù)于即將到來的請求。當(dāng)請求被接收了之后,他處理了請求然后返回去繼續(xù)監(jiān)聽。服務(wù)循環(huán)類似于下面這樣:

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

如果請求需要很長時間來進(jìn)行處理,沒有新的客戶端能夠發(fā)送請求到服務(wù)器中在這段時間內(nèi)。僅僅只有服務(wù)器正在監(jiān)聽的時候,請求能夠被接收。

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

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

通過這種方法,服務(wù)將會馬上返回繼續(xù)監(jiān)聽。這樣更多的客戶端能夠發(fā)送請求到服務(wù)端。服務(wù)端能夠變得更具有響應(yīng)性。

這種情況和桌面程序是一樣的。如果你點(diǎn)了一個按鈕引發(fā)了一個長時間的任務(wù),這個線程執(zhí)行的任務(wù)是更新窗口,按鈕和其他...但是當(dāng)這個任務(wù)執(zhí)行時,這個應(yīng)用將不會響應(yīng)。換一種方式,任務(wù)可以交給工作線程。當(dāng)工作線程忙于這個任務(wù)時,窗口線程能夠回應(yīng)其他用戶的請求。當(dāng)工作線程完成時,他會發(fā)送一個信號給窗口線程。這個窗口線程能夠用任務(wù)的結(jié)果來更新應(yīng)用的界面。這種帶有工作線程設(shè)計(jì)的程序變得更具有響應(yīng)性了。

翻譯自:Multithreading Benefits

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容