多線程比多任務更加有挑戰。多線程是在同一個程序內部並行執行,因此會對相同的內存空間進行併發讀寫操作。這可能是在單線程程序中從來不會遇到的問題。其中的一些錯誤也未必會在單CPU機器上出現,因爲兩個線程從來不會得到真正的並行執行。然而,更現代的計算機伴隨着多核CPU的出現,也就意味着不同的線程能被不同的CPU核得到真正意義的並行執行。
2、多線程的優點
- 資源利用率更好;
- 程序設計在某些情況下更簡單;
- 程序響應更快
3、多線程的代價
- 設計更復雜
雖然有一些多線程應用程序比單線程的應用程序要簡單,但其他的一般都更復雜。在多線程訪問共享數據的時候,這部分代碼需要特別的注意。線程之間的交互往往非常複雜。不正確的線程同步產生的錯誤非常難以被發現,並且重現以修復。
- 上下文切換的開銷
當CPU從執行一個線程切換到執行另外一個線程的時候,它需要先存儲當前線程的本地的數據,程序指針等,然後載入另一個線程的本地數據,程序指針等,最後纔開始執行。這種切換稱爲“上下文切換”(“context switch”)。CPU會在一個上下文中執行一個線程,然後切換到另外一個上下文中執行另外一個線程。上下文切換並不廉價。如果沒有必要,應該減少上下文切換的發生
- 增加資源的消耗
線程在運行的時候需要從計算機裏面得到一些資源。除了CPU,線程還需要一些內存來維持它本地的堆棧。它也需要佔用操作系統中一些資源來管理線程。我們可以嘗試編寫一個程序,讓它創建100個線程,這些線程什麼事情都不做,只是在等待,然後看看這個程序在運行的時候佔用了多少內存。