簡介
多線程在構(gòu)建大型系統(tǒng)的時候是需要重點關(guān)注的一個重要方面,特別是在效率(系統(tǒng)跑得多快?)和性能(系統(tǒng)工作正常?)之間做一個權(quán)衡的時候。恰當?shù)氖褂枚嗑€程可以極大的提高系統(tǒng)性能。
什么是線程?
每個正在系統(tǒng)上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負責多個線程的調(diào)度和執(zhí)行。
什么是多線程?
多線程是為了使得多個線程并行的工作以完成多項任務(wù),以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務(wù)的時候被實現(xiàn)的。
使用線程的好處有以下幾點:
·使用線程可以把占據(jù)長時間的程序中的任務(wù)放到后臺去處理
·用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進度條來顯示處理的進度
·程序的運行速度可能加快
·在一些等待的任務(wù)實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較游泳了。在這種情況下我們可以釋放一些珍貴的資源如內(nèi)存占用等等。
還有其他很多使用多線程的好處,這里就不一一說明了。
一些線程模型的背景
我們可以重點討論一下在Win32環(huán)境中常用的一些模型。
·單線程模型
在這種線程模型中,一個進程中只能有一個線程,剩下的進程必須等待當前的線程執(zhí)行完。這種模型的缺點在于系統(tǒng)完成一個很小的任務(wù)都必須占用很長的時間。
·塊線程模型(單線程多塊模型STA)
這種模型里,一個程序里可能會包含多個執(zhí)行的線程。在這里,每個線程被分為進程里一個單獨的塊。每個進程可以含有多個塊,可以共享多個塊中的數(shù)據(jù)。程序規(guī)定了每個塊中線程的執(zhí)行時間。所有的請求通過Windows消息隊列進行串行化,這樣保證了每個時刻只能訪問一個塊,因而只有一個單獨的進程可以在某一個時刻得到執(zhí)行。這種模型比單線程模型的好處在于,可以響應(yīng)同一時刻的多個用戶請求的任務(wù)而不只是單個用戶請求。但它的性能還不是很好,因為它使用了串行化的線程模型,任務(wù)是一個接一個得到執(zhí)行的。
·多線程塊模型(自由線程塊模型)
多線程塊模型(MTA)在每個進程里只有一個塊而不是多個塊。這單個塊控制著多個線程而不是單個線程。這里不需要消息隊列,因為所有的線程都是相同的塊的一個部分,并且可以共享。這樣的程序比單線程模型和STA的執(zhí)行速度都要塊,因為降低了系統(tǒng)的負載,因而可以優(yōu)化來減少系統(tǒng)idle的時間。這些應(yīng)用程序一般比較復雜,因為程序員必須提供線程同步以保證線程不會并發(fā)的請求相同的資源,因而導致競爭情況的發(fā)生。這里有必要提供一個鎖機制。但是這樣也許會導致系統(tǒng)死鎖的發(fā)生。
多線程在構(gòu)建大型系統(tǒng)的時候是需要重點關(guān)注的一個重要方面,特別是在效率(系統(tǒng)跑得多快?)和性能(系統(tǒng)工作正常?)之間做一個權(quán)衡的時候。恰當?shù)氖褂枚嗑€程可以極大的提高系統(tǒng)性能。
什么是線程?
每個正在系統(tǒng)上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執(zhí)行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負責多個線程的調(diào)度和執(zhí)行。
什么是多線程?
多線程是為了使得多個線程并行的工作以完成多項任務(wù),以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務(wù)的時候被實現(xiàn)的。
使用線程的好處有以下幾點:
·使用線程可以把占據(jù)長時間的程序中的任務(wù)放到后臺去處理
·用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進度條來顯示處理的進度
·程序的運行速度可能加快
·在一些等待的任務(wù)實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較游泳了。在這種情況下我們可以釋放一些珍貴的資源如內(nèi)存占用等等。
還有其他很多使用多線程的好處,這里就不一一說明了。
一些線程模型的背景
我們可以重點討論一下在Win32環(huán)境中常用的一些模型。
·單線程模型
在這種線程模型中,一個進程中只能有一個線程,剩下的進程必須等待當前的線程執(zhí)行完。這種模型的缺點在于系統(tǒng)完成一個很小的任務(wù)都必須占用很長的時間。
·塊線程模型(單線程多塊模型STA)
這種模型里,一個程序里可能會包含多個執(zhí)行的線程。在這里,每個線程被分為進程里一個單獨的塊。每個進程可以含有多個塊,可以共享多個塊中的數(shù)據(jù)。程序規(guī)定了每個塊中線程的執(zhí)行時間。所有的請求通過Windows消息隊列進行串行化,這樣保證了每個時刻只能訪問一個塊,因而只有一個單獨的進程可以在某一個時刻得到執(zhí)行。這種模型比單線程模型的好處在于,可以響應(yīng)同一時刻的多個用戶請求的任務(wù)而不只是單個用戶請求。但它的性能還不是很好,因為它使用了串行化的線程模型,任務(wù)是一個接一個得到執(zhí)行的。
·多線程塊模型(自由線程塊模型)
多線程塊模型(MTA)在每個進程里只有一個塊而不是多個塊。這單個塊控制著多個線程而不是單個線程。這里不需要消息隊列,因為所有的線程都是相同的塊的一個部分,并且可以共享。這樣的程序比單線程模型和STA的執(zhí)行速度都要塊,因為降低了系統(tǒng)的負載,因而可以優(yōu)化來減少系統(tǒng)idle的時間。這些應(yīng)用程序一般比較復雜,因為程序員必須提供線程同步以保證線程不會并發(fā)的請求相同的資源,因而導致競爭情況的發(fā)生。這里有必要提供一個鎖機制。但是這樣也許會導致系統(tǒng)死鎖的發(fā)生。