第8章+多線程-2(課件)-+《算法與程序設(shè)計-C#》同步教學(xué)(清華大學(xué)版)_第1頁
第8章+多線程-2(課件)-+《算法與程序設(shè)計-C#》同步教學(xué)(清華大學(xué)版)_第2頁
第8章+多線程-2(課件)-+《算法與程序設(shè)計-C#》同步教學(xué)(清華大學(xué)版)_第3頁
第8章+多線程-2(課件)-+《算法與程序設(shè)計-C#》同步教學(xué)(清華大學(xué)版)_第4頁
第8章+多線程-2(課件)-+《算法與程序設(shè)計-C#》同步教學(xué)(清華大學(xué)版)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C#程序設(shè)計

第8章

多線程2多線程同步★L(fēng)ockMonitorMutex同步事件線程池3本章目標(biāo)了解線程的基本操作及概念掌握如何創(chuàng)建線程掌握如何暫停和恢復(fù)線程的執(zhí)行掌握如何休眠線程掌握如何終止線程的執(zhí)行掌握線程同步處理4一、線程安全線程安全:指在多個線程并發(fā)使用某個對象時,該對象成員總是保持有效狀態(tài)。常常表現(xiàn)為競爭資源和死鎖現(xiàn)象。競爭資源:兩個或多個線程同時訪問同一數(shù)據(jù)或資源時會導(dǎo)致不符合要求或無法預(yù)期的結(jié)果。死鎖:多個線程彼此等待對方釋放其所占用的資源,最終導(dǎo)致線程的阻塞。5線程同步當(dāng)多個線程可以調(diào)用單個對象的屬性和方法時,一個線程可能會中斷另一個線程正在執(zhí)行的任務(wù),使該對象處于一種無效狀態(tài)。因此必須針對這些調(diào)用進行同步處理使用lock語句同步代碼塊使用監(jiān)視器同步代碼塊6線程同步LockLock關(guān)鍵字將語句塊標(biāo)記為臨界區(qū),方法是獲取給定對象的互斥鎖,執(zhí)行語句,然后釋放該鎖。//定義鎖或監(jiān)視對象Objectobj=newobject();Lock(obj){

同步代碼}各線程所共有的,一般為全局變量或類的成員7線程同步MonitorEnter(Object)在指定對象上獲取排他鎖Exit(Object)釋放指定對象上的排他鎖

try{

Monitor.Enter

(

obj

);dosomething();}finally{

Monitor.Exit(

obj

);}對象或表達式8使用Mutex同步代碼塊Mutex:創(chuàng)建一個新的互斥對象,該對象在任一時刻只能被一個線程所擁有。Pulse或PulseAll通知等待中的線程Mutexmtx=newMutex();//創(chuàng)建一個互斥對象mtx.WaitOne();//請求互斥對象的所有權(quán):成功為true,否則為falsemtx.ReleaseMutex

(

);

//釋放對象可以設(shè)置等待時間:WaitOne(100,true)9案例publicvoidM1(){ Console.WriteLine("媽媽開始做飯!");Thread.Sleep(1000);Console.WriteLine("媽媽做好飯了,媽媽喊張三回家吃飯");}publicvoidM2(){ Console.WriteLine("張三開始吃飯");

}ThreadTesttt=newThreadTest();Threadt1=newThread

(tt.M1);Threadt2=newThread

(tt.M2);t1.Start();

t2.Start();10案例flag=false;publicvoidM1(){

if(flag==false){ Console.WriteLine("媽媽開始做飯!");Thread.Sleep(1000);Console.WriteLine("媽媽做好飯了,媽媽喊張三回家吃飯");

flag=true;}}publicvoidM2(){

if(flag==true){ Console.WriteLine("張三開始吃飯");}

}ThreadTesttt=newThreadTest();Threadt1=newThread

(tt.M1);Threadt2=newThread

(tt.M2);t1.Start();

t2.Start();11同步事件和等待句柄同步事件允許線程通過發(fā)信號互相通信,從而實現(xiàn)線程需要獨占訪問的資源的同步處理控制ManualResetEvent(手動重置的本地事件)ManualResetEventmre=newManualResetEvent(f/t);f:無信號;t:有信號mre.Set();//設(shè)置mre對象為有信號狀態(tài)mre.Reset();//設(shè)置mre對象為無信號狀態(tài)mre.WaitOne(

)//等待信號放在需要鎖定的代碼前ManualResetEvent只能給一個線程加鎖,倘若為多個線程加鎖可以借助多個對象12案例classThreadTest1{ManualResetEventmre=newManualResetEvent(false);publicvoidM1(){Console.WriteLine("媽媽開始做飯!");Thread.Sleep(1000);Console.WriteLine("媽媽做好飯了,媽媽喊張三回家吃飯");Thread.Sleep(1000);mre.Set();}publicvoidM2(){mre.WaitOne();Console.WriteLine("張三開始吃飯");}}13同步事件和等待句柄同步事件允許線程通過發(fā)信號互相通信,從而實現(xiàn)線程需要獨占訪問的資源的同步處理控制AutoResetEvent(自動同步事件)AutoResetEventare=newManualResetEvent(f/t);f:無信號;t:有信號are.Set();//設(shè)置mre對象為有信號狀態(tài)are.Reset();//設(shè)置mre對象為無信號狀態(tài)are.WaitOne(

)//等待信號放在需要鎖定的代碼前AutoResetEvent用于鎖定多個線程14同步事件classThreadTest3{AutoResetEventar=newAutoResetEvent(false);publicvoidM1(){ar.Reset();Console.WriteLine("媽媽開始做飯!");Thread.Sleep(1000);Console.WriteLine("媽媽做好飯了");ar.Set();}publicvoidM3(){ar.Reset();Console.WriteLine("爸爸開始做菜!");Thread.Sleep(1000);Console.WriteLine("爸爸做好菜了");Thread.Sleep(1000);ar.Set();}publicvoidM2(){ar.WaitOne();ar.WaitOne();Console.WriteLine("張三開始吃飯");}}15線程池線程池:是可以用來在后臺執(zhí)行多個任務(wù)的集合。方法說明GetAvailableThreads返回線程池中當(dāng)前可用線程數(shù)GetMaxThreads返回最大線程數(shù),當(dāng)任務(wù)數(shù)大于該值時,任務(wù)將排隊QueueUserWorkItem將方法排隊等待執(zhí)行,方法在有空閑線程時執(zhí)行SetMaxThreads設(shè)置最大線程數(shù)RegisterWaitForSingleObject注冊一個委托等待WaitHandle16案例利用線程池創(chuàng)建線程,完成1~40間所有偶數(shù)的輸出。1

溫馨提示

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

最新文檔

評論

0/150

提交評論