多線程

從軟體或硬體上實現多個線程併發執行的技術

多線程(multithreading),是指從軟體或者硬體上實現多個線程併發執行的技術。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶元級多處理或同時多線程處理器。在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。

簡介


多線程
多線程
在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主進程。可以通過多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些“中斷服務常式”,主進程的暫停是通過硬體級的中斷實現的。儘管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對於其他許多問題,只要求將問題劃分進入獨立運行的程序片斷中,使整個程序能更迅速地響應用戶的請求。
最開始,線程只是用於分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那麼每個線程都可分配給一個不同的處理器,真正進入“并行運算”狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器。程序在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那麼程序會運行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一台印表機。為解決這個問題,對那些可共享的資源來說(比如印表機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務后,再解開(釋放)這個鎖,使其他線程可以接著使用同樣的資源。
多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。

原理


實現多線程是採用一種併發執行機制。
併發執行機制原理:簡單地說就是把一個處理器劃分為若干個短的時間片,每個時間片依次輪流地執行處理各個應用程序,由於一個時間片很短,相對於一個應用程序來說,就好像是處理器在為自己單獨服務一樣,從而達到多個應用程序在同時進行的效果。
多線程就是把操作系統中的這種併發執行機制原理運用在一個程序中,把一個程序劃分為若干個子任務,多個子任務併發執行,每一個任務就是一個線程。這就是多線程程序。

優點


使用線程可以把佔據時間長的程序中的任務放到後台去處理。
用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度。
程序的運行速度可能加快。
在一些等待的任務實現上如用戶輸入、文件讀寫和網路收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存佔用等。
多線程技術在IOS軟體開發中也有舉足輕重的作用。

缺點


如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換。
更多的線程需要更多的內存空間。
線程可能會給程序帶來更多“bug”,因此要小心使用。
線程的中止需要考慮其對程序運行的影響。
通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。

優勢


多進程程序結構和多線程程序結構有很大的不同,多線程程序結構相對於多進程程序結構有以下的優勢:
方便的通信和數據交換
線程間有方便的通信和數據交換機制。對於不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由於同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其他線程所用,這不僅快捷,而且方便。
更高效地利用CPU
使用多線程可以加快應用程序的響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、滑鼠、菜單的操作,而使用多線程技術,將耗時長的操作置於一個新的線程,就可以避免這種尷尬的情況。
同時,多線程使多CPU系統更加有效。操作系統會保證當線程數不大於CPU數目時,不同的線程運行於不同的CPU上。

概念區分


線程與多線程
線程是系統對代碼的執行進程,如果將系統當做一個員工,被安排執行某個任務的時候,他不會對任何其他的任務作出響應。只有當這個任務執行完畢,才可以重新給他分配任務。每一個程序都有一個主線程,負責執行程序必要的任務。
當我們處理一個消耗大的任務(如上傳或下載圖片),如果讓主線程執行這個任務,它會等到動作完成,才繼續後面的代碼。在這段時間之內,主線程處於“忙碌”狀態,也就是無法執行任何其他功能。體現在界面上就是,用戶的界面完全“卡死”。
多線程是指,將原本線性執行的任務分開成若干個子任務同步執行,這樣做的優點是防止線程“堵塞”,增強用戶體驗和程序的效率。缺點是代碼的複雜程度會大大提高,而且對於硬體的要求也相應地提高。

應用


無論是過去還是現在,世界上大多數計算機仍然採用的是馮·諾依曼結構,這種結構的特點就是順序處理,一個處理器在同個時刻只能處理一件事情。 Windows 95/NT採用一種全新的任務調度策略,它把一個進程劃分為多個線程,每個線程輪流佔用CPU的運算時間,操作系統不斷地把線程掛起、喚醒、再掛起、再喚程,如此反覆,由於現在CPU的速度比較快,給人的感覺是多個線程在同時執行,就好像有多個CPU存在於計算機中一樣。
多線程的一個典型例子是:用資源管理器複製文件時,一方面在進行磁碟讀寫操作,同時一張紙不停地從一個文件夾飄到另一個文件夾,這個飄的動作實際上是一段視頻剪輯,也就是說,資源管理器能夠同時進行磁碟讀寫和播放視頻剪輯。