天天看點

關于多線程那些事兒

線程:

每個正在系統上運作的程式都是一個程序。每個程序包含一到多個線程。程序也可能是整個程式或者是部分程式的動态執行。線程是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它了解為代碼運作的上下文。是以線程基本上是輕量級的程序,它負責在單個程式裡執行多任務。通常由作業系統負責多個線程的排程和執行。

多線程:

線程是程式中一個單一的順序控制流程.在單個程式中同時運作多個線程完成不同的工作,稱為多線程.

多線程(英語:multithreading),是指從軟體或者硬體上實作多個線程并發執行的技術。具有多線程能力的計算機因有硬體支援而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。

線程和程序的差別:

線程和程序的差別在于,子程序和父程序有不同的代碼和資料空間,而多個線程則共享資料空間,每個線程有自己的執行堆棧和程式計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定. 線程的運作中需要使用計算機的記憶體資源和CPU。

從程式設計語言的角度看,多線程操作最有價值的特性之一就是程式員不必關心到底使用了多少個處理器。程式在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那麼程式會運作得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運作,而且它們試圖通路相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能将資訊同時發送給一台列印機。為解決這個問題,對那些可共享的資源來說(比如列印機),它們在使用期間必須進入鎖定狀态。是以一個線程可将資源鎖定,在完成了它的任務後,再解開(釋放)這個鎖,使其他線程可以接着使用同樣的資源。

多線程是為了同步完成多項任務,不是為了提高運作效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實作的。

最簡單的比喻多線程就像火車的每一節車廂,而程序則是火車。車廂離開火車是無法跑動的,同理火車也不可能隻有一節車廂。多線程的出現就是為了提高效率。同時它的出現也帶來了一些問題。

優點:

·使用線程可以把占據時間長的程式中的任務放到背景去處理

·使用者界面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度

·程式的運作速度可能加快

·在一些等待的任務實作上如使用者輸入、檔案讀寫和網絡收發資料等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如記憶體占用等等。

.多線程技術在IOS軟體開發中也有舉足輕重的位置。

缺點:

·如果有大量的線程,會影響性能,因為作業系統需要在它們之間切換。

·更多的線程需要更多的記憶體空間。

·線程可能會給程式帶來更多“bug”,是以要小心使用。

·線程的中止需要考慮其對程式運作的影響。

·通常塊模型資料是在多個線程間共享的,需要防止線程死鎖情況的發生。

何時不要使用多線程

    多線程也同樣會帶來缺點,最大的問題是它使程式變的過于複雜,擁有多線程本身并不複雜,複雜是的線程的互動作用,這帶來了無論是否互動是否是有意的,都會帶來較長的開發周期,以及帶來間歇性和非重複性的bugs。是以,要麼多線程的互動設計簡單一些,要麼就根本不使用多線程。除非你有強烈的重寫和調試欲望。

當使用者頻繁地配置設定和切換線程時,多線程會帶來增加資源和CPU的開銷。在某些情況下,太多的I/O操作是非常棘手的,當隻有一個或兩個工作線程要比有衆多的線程在相同時間執行任務塊的多。