若是你的應用程序須要採起如下的操做,那麼你儘可在編程的時候考慮多線程機制:
連續的操做,須要花費忍無可忍的過長時間纔可能完成
並行計算
爲了等待網絡、文件系統、用戶或其餘I/O響應而耗費大量的執行時間
因此說,在動手以前,先保證本身的應用程序中是否出現了以上3種情形。程序員
爲何須要多線程(解釋什麼時候考慮使用線程)
從用戶的角度考慮,就是爲了獲得更好的系統服務;從程序自身的角度考慮,就是使目標任務可以儘量快的完成,更有效的利用系統資源。綜合考慮,通常如下場合須要使用多線程:
一、 程序包含複雜的計算任務時
主要是利用多線程獲取更多的CPU時間(資源)。
二、 處理速度較慢的外圍設備
好比:打印時。再好比網絡程序,涉及數據包的收發,時間因素不定。使用獨立的線程處理這些任務,可以使程序無需專門等待結果。
三、 程序設計自身的須要
WINDOWS系統是基於消息循環的搶佔式多任務系統,爲使消息循環系統不至於阻塞,程序須要多個線程的來共同完成某些任務。編程
每一個正在系統上運行的程序都是一個進程。每一個進程包含一到多個線程。進程也多是整個程序或者是部分程序的動態執行。線程是一組指令的集合,或者是程序的特殊段,它能夠在程序裏獨立執行。也能夠把它理解爲代碼運行的上下文。因此線程基本上是輕量級的進程,它負責在單個程序裏執行多任務。一般由操做系統負責多個線程的調度和執行。
什麼是多線程?
多線程是爲了使得多個線程並行的工做以完成多項任務,以提升系統的效率。線程是在同一時間須要完成多項任務的時候被實現的。
使用線程的好處有如下幾點:
·使用線程能夠把佔據長時間的程序中的任務放到後臺去處理
·用戶界面能夠更加吸引人,這樣好比用戶點擊了一個按鈕去觸發某些事件的處理,能夠彈出一個進度條來顯示處理的進度
·程序的運行速度可能加快
·在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種狀況下咱們能夠釋放一些珍貴的資源如內存佔用等等。
還有其餘不少使用多線程的好處,這裏就不一一說明了。
一些線程模型的背景
咱們能夠重點討論一下在Win32環境中經常使用的一些模型。
·單線程模型
在這種線程模型中,一個進程中只能有一個線程,剩下的進程必須等待當前的線程執行完。這種模型的缺點在於系統完成一個很小的任務都必須佔用很長的時間。
·塊線程模型(單線程多塊模型STA)
這種模型裏,一個程序裏可能會包含多個執行的線程。在這裏,每一個線程被分爲進程裏一個單獨的塊。每一個進程能夠含有多個塊,能夠共享多個塊中的數據。程序規定了每一個塊中線程的執行時間。全部的請求經過Windows消息隊列進行串行化,這樣保證了每一個時刻只能訪問一個塊,於是只有一個單獨的進程能夠在某一個時刻獲得執行。這種模型比單線程模型的好處在於,能夠響應同一時刻的多個用戶請求的任務而不僅是單個用戶請求。但它的性能還不是很好,由於它使用了串行化的線程模型,任務是一個接一個獲得執行的。
·多線程塊模型(自由線程塊模型)
多線程塊模型(MTA)在每一個進程裏只有一個塊而不是多個塊。這單個塊控制着多個線程而不是單個線程。這裏不須要消息隊列,由於全部的線程都是相同的塊的一個部分,而且能夠共享。這樣的程序比單線程模型和STA的執行速度都要塊,由於下降了系統的負載,於是能夠優化來減小系統idle的時間。這些應用程序通常比較複雜,由於程序員必須提供線程同步以保證線程不會併發的請求相同的資源,於是致使競爭狀況的發生。這裏有必要提供一個鎖機制。可是這樣也許會致使系統死鎖的發生。網絡