




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
、實驗目的在掌握基于消息的windows程序結構和多線程程序設汁方法的基礎上,設計一個多線程同步的程序。使學生能夠從程序設計的角度了解多線程程序設計的方法和在windows系統(tǒng)下多線程同步互斥的機制。二、實驗內(nèi)容理解Windows程序設計的基本思想,理解基于消息的程序設計方法,能夠設計出簡單的基于事件的windows程序,完成基本控件的使用結合操作系統(tǒng)中信號量與互斥體的概念,在MFC中找到對應的相關類設計一個多線程同步的程序,多線程概述進程和線程都是操作系統(tǒng)的概念。進程是應用程序的執(zhí)行實例,每個進程是山私有的虛擬地址空間、代碼、數(shù)據(jù)和其它各種系統(tǒng)資源組成,進程在運行過程中創(chuàng)建的資源隨著進程的終止而被銷毀,所使用的系統(tǒng)資源在進程終止時被釋放或關閉。線程是進程內(nèi)部的一個執(zhí)行單元。系統(tǒng)創(chuàng)建好進程后,實際上就啟動執(zhí)行了該進程的主執(zhí)行線程,主執(zhí)行線程以函數(shù)地址形式,比如說main或WinMain函數(shù),將程序的啟動點提供給Windows系統(tǒng)。主執(zhí)行線程終止了,進程也就隨之終止。每一個進程至少有一個主執(zhí)行線程,它無需由用戶去主動創(chuàng)建,是山系統(tǒng)自動創(chuàng)建的。用戶根據(jù)需要在應用程序中創(chuàng)建其它線程,多個線程并發(fā)地運行于同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統(tǒng)資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。多線程可以實現(xiàn)并行處理,避免了某項任務長時間占用CPU時間。要說明的一點是,目前大多數(shù)的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統(tǒng)為每個獨立線程安排一些CPU時間,操作系統(tǒng)以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非?;钴S的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統(tǒng)的性能。這一點在多線程編程時應該注意。Win32SDK函數(shù)支持進行多線程的程序設計,并提供了操作系統(tǒng)原理中的各種同步、互斥和臨界區(qū)等操作。VisualC++6.0中,使用MFC類庫也實現(xiàn)了多線程的程序設訃,使得多線程編程更加方便。VC中提供線程同步的方法:臨界區(qū)(CCriticalSection)事件(CEvent)互斥量(CMutex)信號量(CSemaphore)A、使用CCriticalSection類當多個線程訪問一個獨占性共享資源時,可以使用“臨界區(qū)”對象。任一時刻只有一個線程可以擁有臨界區(qū)對象,擁有臨界區(qū)的線程可以訪問被保護起來的資源或代碼段,其他希望進入臨界區(qū)的線程將被掛起等待,直到擁有臨界區(qū)的線程放棄臨界區(qū)時為止,這樣就保證了不會在同一時刻出現(xiàn)多個線程訪問共享資源。CCriticalSection類的用法非常簡單,步驟如下:定義CCriticalSection類的一個全局對象(以使各個線程均能訪問),如CCriticalSectioncritical_section:在訪問需要保護的資源或代碼之前,調(diào)用CCriticalSection類的成員Lock()獲得臨界區(qū)對象:critical_section.Lock();在線程中調(diào)用該函數(shù)來使線程獲得它所請求的臨界區(qū)。如果此時沒有其它線程占有臨界區(qū)對象,則調(diào)用Lock()的線程獲得臨界區(qū);否則,線程將被掛起,并放入到一個系統(tǒng)隊列中等待,直到當前擁有臨界區(qū)的線程釋放了臨界區(qū)時為止。訪問臨界區(qū)完畢后,使用CCriticalSection的成員函數(shù)Unlock()來釋放臨界區(qū):critical_section.Unlock():再通俗一點講,就是線程A執(zhí)行到critical_section.Lock();語句時,如果其它線程(B)正在執(zhí)行critical_section.Lock();語句后且critical_section.Unlock();語句前的語句時,線程A就會等待,直到線程B執(zhí)行完critical_section.Unlock();語句,線程A才會繼續(xù)執(zhí)行。B、使用CEvent類CEvent類提供了對事件的支持。事件是一個允許一個線程在某種情況發(fā)生時,喚醒另外一個線程的同步對象。例如在某些網(wǎng)絡應用程序中,一個線程(記為A)負責監(jiān)聽通訊端口,另外一個線程(記為B)負責更新用戶數(shù)據(jù)。通過使用CEvent類,線程A可以通知線程B何時更新用戶數(shù)據(jù)。每一個CEvent對象可以有兩種狀態(tài):有信號狀態(tài)和無信號狀態(tài)。線程監(jiān)視位于其中的CEvent類對象的狀態(tài),并在相應的時候釆取相應的操作。在MFC中,CEvent類對象有兩種類型:人工事件和自動事件。一個自動CEvent對象在被至少一個線程釋放后會自動返回到無信號狀態(tài);而人工事件對象獲得信號后,釋放可利用線程,但直到調(diào)用成員函數(shù)ReSetEvent()才將其設置為無信號狀態(tài)。在創(chuàng)建CEvent類的對象時,默認創(chuàng)建的是自動事件。CEvent類的各成員函數(shù)的原型和參數(shù)說明如下:1、 CEvent(BOOLbInitiallyOwn=FALSE,BOOLbMdnualReset二FALSE,LPCTSTRlpszName=XULL,LPSECURITY.ATTRIBUTESlpsaAttribute二NULL);blnitiallyO^-n:指定事件對象初始化狀態(tài),TRUE為有信號,F(xiàn)ALSE為無信號;bManualReset:指定要創(chuàng)建的事件是屬于人工事件還是自動事件。TRUE為人工事件,F(xiàn)ALSE為自動事件;后兩個參數(shù)一般設為NULL,在此不作過多說明。2、 BOOLCEvent::SetEvent();將CEvent類對象的狀態(tài)設置為有信號狀態(tài)。如果事件是人工事件,則CEvent類對象保持為有信號狀態(tài),直到調(diào)用成員函數(shù)ResetEvent()將其重新設為無信號狀態(tài)時為止。如果CEvent類對象為自動事件,則在SetEvent()將事件設置為有信號狀態(tài)后,CEvent類對象山系統(tǒng)自動重置為無信號狀態(tài)。如果該函數(shù)執(zhí)行成功,則返回非零值,否則返回零。3、BOOLCEvent::ResetEvent();該函數(shù)將事件的狀態(tài)設置為無信號狀態(tài),并保持該狀態(tài)直至SetEvent()被調(diào)用時為止。山于自動事件是山系統(tǒng)自動重置,故自動事件不需要調(diào)用該函數(shù)。如果該函數(shù)執(zhí)行成功,返回非零值,否則返回零。我們一般通過調(diào)用WaitForSingleObject函數(shù)來監(jiān)視事件狀態(tài)。前面我們已經(jīng)介紹了該函數(shù)。由于語言描述的原因,CEvent類的理解確實有些難度,但您只要通過仔細玩味下面例程,多看兒遍就可理解。C、 使用CMutex類互斥對象與臨界區(qū)對象很像.互斥對象與臨界區(qū)對象的不同在于:互斥對象可以在進程間使用,而臨界區(qū)對象只能在同一進程的各線程間使用。當然,互斥對象也可以用于同一進程的各個線程間,但是在這種情況下,使用臨界區(qū)會更節(jié)省系統(tǒng)資源,更有效率。D、 使用CSemaphore類當需要一個訃數(shù)器來限制可以使用某個線程的數(shù)H時,可以使用“信號量”對象。CSemaphore類的對象保存了對當前訪問某一指定資源的線程的計數(shù)值,該計數(shù)值是當前還可以使用該資源的線程的數(shù)口。如果這個計數(shù)達到了零,則所有對這個CSemaphore類對象所控制的資源的訪問嘗試都被放入到一個隊列中等待,直到超時或計數(shù)值不為零時為止。一個線程被釋放已訪問了被保護的資源時,計數(shù)值減1;一個線程完成了對被控共事資源的訪問時,計數(shù)值增1。這個被CSemaphore類對象所控制的資源可以同時接受訪問的最大線程數(shù)在該對象的構建函數(shù)中指定。CSemaphore類的構造函數(shù)原型及參數(shù)說明如下:CSemaphore(LONGllnitialCount二1,LONGlMaxCount=l,LPCTSTRpstrName=NULL,LPSECURITY.ATTRIBUTESlpsaAttributes=NULL);llnitialCount:信號量對象的初始計?數(shù)值,即可訪問線程數(shù)LI的初始值;IMaxCount:信號量對象計數(shù)值的最大值,該參數(shù)決定了同一時刻可訪問山信號量保護的資源的線程最大數(shù)目;后兩個參數(shù)在同一進程中使用一般為NULL,不作過多討論;在用CSemaphore類的構造函數(shù)創(chuàng)建信號量對象時要同時指岀允許的最大資源訃數(shù)和當前可用資源計數(shù)。一般是將當前可用資源計數(shù)設置為最大資源計數(shù),每增加一個線程對共享資源的訪問,當前可用資源訃數(shù)就會減1,只要當前可用資源計數(shù)是大于0的,就可以發(fā)出信號量信號。但是當前可用計數(shù)減小到0時,則說明當前占用資源的線程數(shù)已經(jīng)達到了所允許的最大數(shù)II,不能再允許其它線程的進入,此時的信號量信號將無法發(fā)出。線程在處理完共享資源后,應在離開的同時通過ReleaseSemaphore()函數(shù)將當前可用資源數(shù)加1。三、實驗方案本系統(tǒng)通過VC提供的四種線程同步方案同時實現(xiàn)線程的同步。其架構圖如圖1-1所示。圖1-1系統(tǒng)結構示意圖通過VC提供的線程創(chuàng)建函數(shù):CWinThread*AfxBeginThread(AFX.THREADPROCpfnThreadProc,LPVOIDpParam,intnPrior辻y二THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY.ATTRIBUTESIpSecur
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030國內(nèi)無影燈行業(yè)市場發(fā)展現(xiàn)狀及發(fā)展前景與投資機會研究報告
- 2025-2030辦公文具市場發(fā)展分析及行業(yè)投資戰(zhàn)略研究報告
- 山東省菏澤市巨野縣第一中學2025屆高三下第一次測試英語試題含解析
- 2025-2030低脂非奶奶精行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030二沖程越野發(fā)動機行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 江西省江西師大附中2025屆高三第二次模擬考試英語試卷含答案
- 蘇州市蘇州實驗中學2025年高三下第一次測試英語試題含答案
- 2025-2030中國飲用桶裝水行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025屆牛欄山一中高三第一次模擬考試英語試卷含答案
- 江蘇省南京市鹽城市2025屆高考英語必刷試卷含解析
- (正式版)JTT 1490-2024 港口安全設施分類與編碼
- 21《楊氏之子》公開課一等獎創(chuàng)新教案
- 車輛應急預案方案惡劣天氣
- 【部編版】語文五年級下冊第五單元《交流平臺 初試身手》精美課件
- 枇杷文化知識講座
- 浙江偉鋒藥業(yè)有限公司年產(chǎn)100噸拉米夫定、50噸恩曲他濱、30噸卡培他濱技改項目環(huán)境影響報告
- 公路養(yǎng)護安全作業(yè)規(guī)程-四級公路養(yǎng)護作業(yè)控制區(qū)布置
- 八年級家長會領導講話4篇
- 美世國際職位評估體系IPE3.0使用手冊
- 焦慮抑郁患者護理課件
- 戶外招牌安全承諾書
評論
0/150
提交評論