多線程的優(yōu)勢(shì)

多線程的優(yōu)勢(shì)

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

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

更好的資源利用率

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

翻譯自:Multithreading Benefits

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

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

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

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