教程079多線程支持_第1頁
教程079多線程支持_第2頁
教程079多線程支持_第3頁
教程079多線程支持_第4頁
教程079多線程支持_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、多線程開放分類: 程序、API線程?英文:Thread每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。進(jìn)程也可能是整個(gè)程序或者是部分程序的動(dòng)態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。多線程?多線程是為了使得多個(gè)線程并行的工作以完成多項(xiàng)任務(wù),以提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候被實(shí)現(xiàn)的。使用線程的好處有以下幾點(diǎn):使用線程可以把占據(jù)長時(shí)間的程序中的任務(wù)放到去處理用戶界面可以更加吸引人,這樣比如用戶點(diǎn)擊了

2、一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來顯示處理的進(jìn)度程序的運(yùn)行速度可能加快在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以一些珍貴的資源如內(nèi)存占用等等。還有其他很多使用多線程的好處,這里就不一一說明了。一些線程模型的背景可以重點(diǎn)一下在Win32 環(huán)境中常用的一些模型。單線程模型在這種線程模型中,一個(gè)進(jìn)程中只能有一個(gè)線程,剩下的進(jìn)程必須等待當(dāng)前的線程執(zhí)行完。這種模型的缺點(diǎn)在于系統(tǒng)完成一個(gè)很小的任務(wù)都必須占用很長的時(shí)間。塊線程模型(單線程多塊模型STA)這種模型里,一個(gè)程序里可能會(huì)包含多個(gè)執(zhí)行的線程。在這里,每個(gè)線程被分為進(jìn)程里一個(gè)單獨(dú)的塊

3、。每個(gè)進(jìn)程可以含有多個(gè)塊,可以共享多個(gè)塊中的數(shù)據(jù)。程序規(guī)定了每個(gè)塊中線程的執(zhí)行時(shí)間。所有的請求通過Windows 消息隊(duì)列進(jìn)行串行化,這樣保證了每個(gè)時(shí)刻只能一個(gè)塊,因而只有一個(gè)單獨(dú)的進(jìn)程可以在某一個(gè)時(shí)刻得到執(zhí)行。這種模型比單線程模型的好處在于,可以響應(yīng)同一時(shí)刻的多個(gè)用戶請求的任務(wù)而不只是單個(gè)用戶請求。但它的性能還不是很好,因?yàn)樗褂昧舜谢木€程模型,任務(wù)是一個(gè)接一個(gè)得到執(zhí)行的。多線程塊模型(線程塊模型)多線程塊模型(MTA)在每個(gè)進(jìn)程里只有一個(gè)塊而不是多個(gè)塊。這單個(gè)塊控制著多個(gè)線程而不是單個(gè)線程。這里不需要消息隊(duì)列,因?yàn)樗械木€程都是相同的塊的一個(gè)部分,并且可以共享。這樣的程序比單線程模型和

4、STA 的執(zhí)行速度都要塊,因?yàn)榻档土讼到y(tǒng)的負(fù)載,因而可以優(yōu)化來減少系統(tǒng) idle 的時(shí)間。這些應(yīng)用程序一般比較復(fù)雜,因?yàn)槌绦騿T必須提供線程同步以保證線程不會(huì)并發(fā)的請求相同的資源,因而導(dǎo)致競爭情況的發(fā)生。這里有必要提供一個(gè)鎖機(jī)制。但是這樣也許會(huì)導(dǎo)致系統(tǒng)死鎖的發(fā)生。多線程在.NET 里如何工作?在本質(zhì)上和結(jié)構(gòu)來說,.NET 是一個(gè)多線程的環(huán)境。有兩種主要的多線程方法是.NET 所提倡的:使用ThreadStart 來開始你自己的進(jìn)程,直接的(使用 ThreStream.BeginRead,或者調(diào)用BeginInvoke)使用 Threool.QueueUserWorkItem)或者間接的(比如oo

5、l 類。一般來說,你可以手動(dòng)為長時(shí)間運(yùn)行的任務(wù)創(chuàng)建一個(gè)新的線程,另外對(duì)于短時(shí)間運(yùn)行的任務(wù)尤其是經(jīng)常需要開始的那些,進(jìn)程池是一個(gè)非常好的選擇。進(jìn)程池可以同時(shí)運(yùn)行多個(gè)任務(wù),還可以使用框架類。對(duì)于資源緊缺需要進(jìn)行同步的情況來說,它可以限制某一時(shí)刻只允許一個(gè)線程資源。這種情況可以視為給線程實(shí)現(xiàn)了鎖機(jī)制。線程的基類是System.Threading。所有線程通過 CLI 來進(jìn)行管理。創(chuàng)建線程:創(chuàng)建一個(gè)新的Thread 對(duì)象的實(shí)例。Thread 的構(gòu)造函數(shù)接受一個(gè)參數(shù):Thread DummyThread = new Thread( new ThreadStart(dummyFunction) );執(zhí)行線

6、程:使用Threading 命名空間里的start 方法來運(yùn)行線程:DummyThread.Start ();組合線程:經(jīng)常會(huì)出現(xiàn)需要組合多個(gè)線程的情況,就是當(dāng)某個(gè)線程需要其他線程的結(jié)束來完成自己的任務(wù)。假設(shè)DummyThread 必須等待DummyPriorityThread 來完成自己的任務(wù),只需要這樣做:DummyPriorityThread.Join() ;暫停線程:使得線程暫停給定的秒DummyPriorityThread.Sleep();中止線程:如果需要中止線程可以使用如下的代碼:DummyPriorityThread.Abort();同步經(jīng)常我們會(huì)遇到需要在線程間進(jìn)行同步的情況

7、,下面的代碼給出了一些方法:using System;using System.Threading;namespace SynchronizationThreadsExample class SynchronizationThreadsExampleprivate int counter = 0; static void Main( ) SynchronizationThreadsExample STE = new SynchronizationThreadsExample(); STE.ThreadFunction( );public void ThreadFunction ( ) Thre

8、ad DummyThread = new Thread( new ThreadStart(SomeFunction) ; DummyThread.IsBackground=true;DummyThread.Name = First Thread; DummyThread.Start( );Console.WriteLine(Started thread , DummyThread.Name);Thread DummyPriorityThread = new Thread( new ThreadStart(SomeFunction) ); DummyPriorityThread.IsBackgr

9、ound=true;DummyPriorityThread.Name = Second Thread; DummyPriorityThread.Start( );Console.WriteLine(Started thread , DummyPriorityThread.Name); DummyThread.Join( );DummyPriorityThread.Join( );public void SomeFunction( ) try while (counter 10) int tempCounter = counter; tempCounter +; Thread.Sleep(1);

10、counter = tempCounter;Console.WriteLine( Thread . SomeFunction: ,Thread.CurrentThread.Name, counter);catch (ThreadInterruptedException Ex) Console.WriteLine( Exception in thread , Thread.CurrentThread.Name);finally Console.WriteLine( Thread Exiting. ,Thread.CurrentThread.Name);使用InterlockC#提供了一個(gè)特殊的類叫做 interlocked,就是提供了鎖機(jī)制的實(shí)現(xiàn),我們可以加入如下的代碼實(shí)現(xiàn)鎖機(jī)制:Interlocked.SomeFunction (ref counter);使用鎖這是為了鎖定代碼關(guān)鍵區(qū)域以進(jìn)行同步,鎖定代碼如下:lock (this) Some statements ;使用Monitor當(dāng)有需要進(jìn)行線程管理的時(shí)候我們可以使用:Monitor.Enter(this);其他也有一些方法進(jìn)行管理,這里就不一一提及了。線程的缺點(diǎn)線程自然也有缺點(diǎn),以下列出了一些:如果有大量的線程,會(huì)影響性能,因?yàn)椴僮飨到y(tǒng)需要在他們之間切換;更多的線程需要更多的內(nèi)存空間線程會(huì)給程序帶來

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論