從單線程應(yīng)用到多線程應(yīng)用帶來的不僅僅是好處。也會(huì)帶來開銷。不要僅僅在一個(gè)應(yīng)用中使用多線程僅僅是因?yàn)槟隳軌?會(huì))使用多線程。你應(yīng)該能確定使用多線程帶來的好處要遠(yuǎn)遠(yuǎn)多于它帶來的花銷。如果不能夠確定,那么請嘗試測量應(yīng)用的性能和響應(yīng)性,不僅僅是猜測。
更復(fù)雜的設(shè)計(jì)
盡管多線程應(yīng)用的某些部分要比單線程應(yīng)用更加簡單,但是應(yīng)用的另一些部分會(huì)變得更加復(fù)雜。當(dāng)一個(gè)多線程應(yīng)用訪問共享數(shù)據(jù)時(shí)要特別注意。線程的交互一點(diǎn)也不簡單。錯(cuò)誤總是在不正確的線程同步中產(chǎn)生,而且很難發(fā)現(xiàn)、重現(xiàn)、修復(fù)。
線程切換開銷
當(dāng)一個(gè)cpu從一個(gè)線程切換到另一個(gè)線程時(shí),cpu需要保存當(dāng)前線程的本地?cái)?shù)據(jù),程序當(dāng)前的指針等,然后加載下一個(gè)等待執(zhí)行的線程的本地?cái)?shù)據(jù),程序指針等。這種切換被稱之為上下文切換。cpu從執(zhí)行一個(gè)線程切換去執(zhí)行另一個(gè)線程。
上下文切換需要花費(fèi)很多資源。除非必要,你不要去切換上下文。
你能夠讀更多的信息關(guān)于上下文在維基百科上面。
增加的資源消耗
為了啟動(dòng)一個(gè)線程需要消耗一些計(jì)算機(jī)的資源。而且一個(gè)線程cpu時(shí)間(?)需要一些內(nèi)存來存儲(chǔ)它的本地的棧。它也會(huì)在操作系統(tǒng)中占據(jù)一些資源來管理線程。嘗試創(chuàng)建一個(gè)擁有100個(gè)線程的程序,每一個(gè)線程什么都不做,僅僅是等待,然后看看當(dāng)這個(gè)應(yīng)用運(yùn)行的時(shí)候占據(jù)了多少內(nèi)存。
ps:本人只是一個(gè)自學(xué)英語一段時(shí)間的初級(jí)程序猿。無論是英語翻譯程度,還是技術(shù)理解程度都遠(yuǎn)遠(yuǎn)不足,如果文中有翻譯不到位,或者技術(shù)理解錯(cuò)誤情況,還請各位指出,必定改正,也可相互學(xué)習(xí)交流。