Windows多線程編程及調(diào)試市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第1頁(yè)
Windows多線程編程及調(diào)試市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第2頁(yè)
Windows多線程編程及調(diào)試市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第3頁(yè)
Windows多線程編程及調(diào)試市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第4頁(yè)
Windows多線程編程及調(diào)試市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Windows多線程編程及調(diào)優(yōu)Win32API是Windows操作系統(tǒng)為內(nèi)核以及應(yīng)用程序之間提供接口,將內(nèi)核提供功效進(jìn)行函數(shù)封裝,應(yīng)用程序經(jīng)過調(diào)用相關(guān)函數(shù)取得對(duì)應(yīng)系統(tǒng)功效。MFC是微軟基礎(chǔ)函數(shù)類庫(kù)(MicrosoftFoundationClasses),由微軟提供,用類庫(kù)方式將Win32API進(jìn)行封裝,以類方式提供給開發(fā)者。.NET

Framework

由兩部分組成:公共語(yǔ)言運(yùn)行庫(kù)(Common

Language

Runtime

,CLR)和Framework類庫(kù)(Framework

Class

Library

,F(xiàn)CL)。.NET基礎(chǔ)類庫(kù)System.Threading命名空間提供了大量類和接口來(lái)支持多線程。全部與多線程機(jī)制相關(guān)類都存放在System.Threading命名空間中。Windows多線程編程及調(diào)試第1頁(yè)使用Win32線程APIWin32函數(shù)庫(kù)中提供了操作多線程函數(shù),包含創(chuàng)建線程、管理線程、終止線程、線程同時(shí)等接口。線程函數(shù):DWORDWINAPIThreadFunc(LPVOIDlpvThreadParm)線程創(chuàng)建HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);Windows多線程編程及調(diào)試第2頁(yè)Windows多線程編程及調(diào)試第3頁(yè)CreateThread不會(huì)執(zhí)行C運(yùn)行時(shí)數(shù)據(jù)塊,所以在C運(yùn)行時(shí)庫(kù)應(yīng)用程序中,不能使CreateThread創(chuàng)建線程,微軟提供了另外創(chuàng)建方法:創(chuàng)建線程用process.h頭文件中申明c執(zhí)行時(shí)期鏈接庫(kù)函數(shù)_beginthread函數(shù),uintptr_t_beginthread(void(*start_address)(void*),unsignedstack_size,void*arglist);Windows多線程編程及調(diào)試第4頁(yè)Windows多線程編程及調(diào)試第5頁(yè)使用Win32線程API線程管理控制和操作線程(管理),Windows允許對(duì)創(chuàng)建線程進(jìn)行掛起或運(yùn)行操作,進(jìn)入對(duì)應(yīng)狀態(tài)。線程中每個(gè)線程都有掛起計(jì)數(shù)器,當(dāng)掛起計(jì)數(shù)器為0時(shí),線程被執(zhí)行,當(dāng)掛起計(jì)數(shù)器值大于0時(shí),調(diào)度器不去調(diào)度該線程。不能夠直接訪問現(xiàn)成掛起計(jì)數(shù)器,能夠經(jīng)過調(diào)用API函數(shù)來(lái)改變它值,兩個(gè)函數(shù):DWORDSuspendThread(HANDLEhThread):掛起操作,假如函數(shù)執(zhí)行成功,線程中止執(zhí)行,調(diào)用一次,線程掛起計(jì)數(shù)器值增1;DWORDResumeThread(HANDLEhThread):用于結(jié)束線程掛起狀態(tài)操作,每次調(diào)用該函數(shù),線程掛起計(jì)數(shù)器值減1,若掛起計(jì)數(shù)器值為0,則不會(huì)再減。Windows多線程編程及調(diào)試第6頁(yè)線程等候Win32API提供了一組能使線程阻塞其本身執(zhí)行等候函數(shù)WaitForSingleObject、WaitForMultipleObject。這些函數(shù)在其參數(shù)中一個(gè)或多個(gè)同時(shí)對(duì)象中產(chǎn)生了信號(hào),或者在超出要求時(shí)間才返回。在等候函數(shù)未返回時(shí),線程處于等候狀態(tài),線程不消耗CPU時(shí)間.線程終止

線程函數(shù)返回時(shí),線程自動(dòng)終止,假如需要在線程執(zhí)行過程中終止則可調(diào)用ExitThread函數(shù)。假如在線程之外終止線程,能夠調(diào)用TerminateThread函數(shù)。Windows多線程編程及調(diào)試第7頁(yè)Windows多線程編程及調(diào)試第8頁(yè)Windows多線程編程及調(diào)試第9頁(yè)線程同時(shí)實(shí)現(xiàn)

在Win32中,同時(shí)機(jī)制主要有以下幾個(gè):全局變量事件(Event)臨界區(qū)(Criticalsection)互斥量(Mutex)信號(hào)量(Semaphore)全局變量進(jìn)程中全部線程都能夠訪問全部全局變量,全局變量成為win32多線程通信最簡(jiǎn)單方式

Windows多線程編程及調(diào)試第10頁(yè)Windows多線程編程及調(diào)試第11頁(yè)事件(Event)事件(Event)Win32提供最靈活線程間同時(shí)方式.事件存在兩種狀態(tài):激發(fā)狀態(tài);未激發(fā)狀態(tài).創(chuàng)建事件函數(shù)原型:HANDLECreateEvent(

LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbInitialState,LPCTSTRlpName);Windows多線程編程及調(diào)試第12頁(yè)事件(Event)事件設(shè)置分類:手動(dòng)設(shè)置:這種對(duì)象只能用程序來(lái)手動(dòng)設(shè)置,在需要該事件或者事件發(fā)生時(shí),采取SetEvent及ResetEvent來(lái)進(jìn)行設(shè)置。SetEvent只有一個(gè)參數(shù),該參數(shù)指定了時(shí)間對(duì)象句柄值,若事件成功激發(fā),返回TRUE;ResetEvent函數(shù)將事件對(duì)象恢復(fù)到最初非激發(fā)狀態(tài),只有一個(gè)參數(shù),成功后返回真.自動(dòng)恢復(fù):一旦事件發(fā)生并被處理后,將自動(dòng)恢復(fù)到?jīng)]有事件狀態(tài),所以不需要再次設(shè)置。事件機(jī)制應(yīng)用實(shí)例:有三個(gè)線程:主、讀、寫。讀線程必須在寫線程完成寫操作之后進(jìn)行讀操作,根本程必須在讀線程進(jìn)行完讀操作之后才結(jié)束.Windows多線程編程及調(diào)試第13頁(yè)Windows多線程編程及調(diào)試第14頁(yè)臨界區(qū)臨界區(qū):預(yù)防多個(gè)線程同時(shí)執(zhí)行一個(gè)特定代碼段機(jī)制,適合用于多個(gè)線程操作之間沒有先后次序但要求互斥同時(shí)。多個(gè)線程訪問同一個(gè)臨界區(qū)標(biāo)準(zhǔn):一次最多只能一個(gè)線程停留在臨界區(qū)內(nèi);不能讓一個(gè)線程無(wú)限地停留在臨界區(qū)內(nèi),不然其它線程將不能進(jìn)入該臨界區(qū)。臨界區(qū)變量定義方法:CRITICAL_SECTIONgCritical_Section;(全局)Windows多線程編程及調(diào)試第15頁(yè)臨界區(qū)相關(guān)API:初始化臨界區(qū)InitializeCriticalSection(&cs);刪除臨界區(qū)DeleteCriticalSection(&cs);進(jìn)入臨界區(qū)EnterCriticalSection(&cs);離開臨界區(qū)LeaveCriticalSection(&cs);臨界區(qū)同時(shí)機(jī)制實(shí)例:比如一個(gè)銀行系統(tǒng)有兩個(gè)線程執(zhí)行取款任務(wù),一個(gè)使用存折在柜臺(tái)取款,另一個(gè)使用銀行卡在ATM機(jī)上取款。若不加控制,很可能帳戶余額不足于兩次取款總額,但還是能把款取走。如:100元被取走110元。Windows多線程編程及調(diào)試第16頁(yè)Windows多線程編程及調(diào)試第17頁(yè)Windows多線程編程及調(diào)試第18頁(yè)互斥量互斥量:協(xié)調(diào)多個(gè)線程活動(dòng),經(jīng)過鎖定和取消鎖定資源,控制對(duì)共享資源訪問。作用就是確保每次只能有一個(gè)線程取得互斥量,解鎖互斥量線程一定也是對(duì)其加鎖線程。創(chuàng)建函數(shù):HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);相關(guān)API操作以下:CreateMutex創(chuàng)建一個(gè)互斥量,返回對(duì)象句柄OpenMutex打開并返回一個(gè)已存在互斥對(duì)象句柄,使之后續(xù)訪問。ReleaseMutex釋放對(duì)互斥量占用,使之成為可用。Windows多線程編程及調(diào)試第19頁(yè)Windows多線程編程及調(diào)試第20頁(yè)Windows多線程編程及調(diào)試第21頁(yè)信號(hào)量信號(hào)量是一個(gè)關(guān)鍵對(duì)象,擁有一個(gè)計(jì)數(shù)器,可用來(lái)管理大量有限系統(tǒng)資源,當(dāng)計(jì)數(shù)器大于0時(shí),信號(hào)量為有信號(hào)狀態(tài),當(dāng)計(jì)數(shù)值為0時(shí),信號(hào)量就處于無(wú)信號(hào)狀態(tài)。創(chuàng)建信號(hào)量

HANDLECreateSemaphore(

LPSECURITY_ATTRIBUTESlpSA,LONGlInitialCount,

LONGlMaximumCount,

LPCTSTRlpName);Windows多線程編程及調(diào)試第22頁(yè)信號(hào)量釋放信號(hào)量

BOOLReleaseSemaphore(

HANDLEhSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount);打開信號(hào)量

HANDLEOpenSemaphore(

DWORDdwDesiredAccess,

BOOLbInheritHandle,

LPCTSTRlpName);Windows多線程編程及調(diào)試第23頁(yè)Windows多線程編程及調(diào)試第24頁(yè)Windows多線程編程及調(diào)試第25頁(yè)MFC線程同時(shí)實(shí)現(xiàn)MFC經(jīng)過全局函數(shù)afxBeginThread()來(lái)創(chuàng)建一個(gè)CWinThread對(duì)象。MFC同時(shí)類CCriticalSection只允許當(dāng)前進(jìn)程中一個(gè)線程訪問某個(gè)對(duì)象同時(shí)類CMutes只允許系統(tǒng)中一個(gè)進(jìn)程內(nèi)一個(gè)線程訪問某個(gè)對(duì)象同時(shí)類CSymaphore只允許一到某個(gè)指定數(shù)目個(gè)線程同時(shí)訪問某個(gè)對(duì)象同時(shí)類CEvent當(dāng)某個(gè)事件發(fā)生時(shí)通知一個(gè)應(yīng)用程序同時(shí)類Windows多線程編程及調(diào)試第26頁(yè)MFC線程同時(shí)實(shí)現(xiàn)實(shí)例:創(chuàng)建MFCAppWizardExe工程,對(duì)4個(gè)數(shù)組排序后,經(jīng)過信號(hào)量同時(shí)機(jī)制,依次顯示每個(gè)數(shù)組經(jīng)過排序后輸出。HANDLEg_hBusy;HWNDhwnd;intk=0;longdata1[]={12,32,47,763,75,43,86,42};longdata2[]={432,68,36,84,47,73,732,46};longdata3[]={435,754,37,765,48,785,326,78};longdata4[]={54,76,93,457,456,34,94,50};Windows多線程編程及調(diào)試第27頁(yè)Windows多線程編程及調(diào)試第28頁(yè)Windows多線程編程及調(diào)試第29頁(yè)Windows多線程編程及調(diào)試第30頁(yè).NETFramework多線程實(shí)現(xiàn)創(chuàng)建輔助(或隸屬)線程第一個(gè)步驟是創(chuàng)建ThreadStart代理,指定要由該線程執(zhí)行線程函數(shù)。然后將ThreadStart代理傳遞給Thread類結(jié)構(gòu)函數(shù)。ThreadStartstarter=newThreadStart(MyFunction);Threadt=newThread(starter);t.Start();線程創(chuàng)建好后,能夠使用Thread類下方法對(duì)線程進(jìn)行控制:Resume 繼續(xù)已掛起線程。Sleep 將當(dāng)前線程阻塞指定毫秒數(shù)。Suspend掛起線程。Abort 調(diào)用此方法通常會(huì)終止線程。Windows多線程編程及調(diào)試第31頁(yè)Windows多線程編程及調(diào)試第32頁(yè)Windows多線程編程及調(diào)試第33頁(yè).NET框架下同時(shí)機(jī)制實(shí)現(xiàn).NETframework提供了很多類和數(shù)據(jù)類型來(lái)控制對(duì)共享資源訪問。Monitor類WaitHandle類Mutex類AutoResetEvent類InterLocked類Windows多線程編程及調(diào)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論