資源描述:
《windows的多線程同步實(shí)驗(yàn)報(bào)告》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、一、實(shí)驗(yàn)?zāi)康脑谡莆栈谙⒌膚indows程序結(jié)構(gòu)和多線程程序設(shè)計(jì)方法的基礎(chǔ)上,設(shè)計(jì)一個(gè)多線程同步的程序。使學(xué)生能夠從程序設(shè)計(jì)的角度了解多線程程序設(shè)計(jì)的方法和在windows系統(tǒng)下多線程同步互斥的機(jī)制。二、實(shí)驗(yàn)內(nèi)容1.理解Windows程序設(shè)計(jì)的基本思想,理解基于消息的程序設(shè)計(jì)方法,能夠設(shè)計(jì)出簡(jiǎn)單的基于事件的windows程序,完成基本控件的使用2.結(jié)合操作系統(tǒng)中信號(hào)量與互斥體的概念,在MFC中找到對(duì)應(yīng)的相關(guān)類3.設(shè)計(jì)一個(gè)多線程同步的程序,多線程概述進(jìn)程和線程都是操作系統(tǒng)的概念。進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)
2、例,每個(gè)進(jìn)程是由私有的虛擬地址空間、代碼、數(shù)據(jù)和其它各種系統(tǒng)資源組成,進(jìn)程在運(yùn)行過(guò)程中創(chuàng)建的資源隨著進(jìn)程的終止而被銷毀,所使用的系統(tǒng)資源在進(jìn)程終止時(shí)被釋放或關(guān)閉。線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行單元。系統(tǒng)創(chuàng)建好進(jìn)程后,實(shí)際上就啟動(dòng)執(zhí)行了該進(jìn)程的主執(zhí)行線程,主執(zhí)行線程以函數(shù)地址形式,比如說(shuō)main或WinMain函數(shù),將程序的啟動(dòng)點(diǎn)提供給Windows系統(tǒng)。主執(zhí)行線程終止了,進(jìn)程也就隨之終止。每一個(gè)進(jìn)程至少有一個(gè)主執(zhí)行線程,它無(wú)需由用戶去主動(dòng)創(chuàng)建,是由系統(tǒng)自動(dòng)創(chuàng)建的。用戶根據(jù)需要在應(yīng)用程序中創(chuàng)建其它線程,多個(gè)線
3、程并發(fā)地運(yùn)行于同一個(gè)進(jìn)程中。一個(gè)進(jìn)程中的所有線程都在該進(jìn)程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統(tǒng)資源,所以線程間的通訊非常方便,多線程技術(shù)的應(yīng)用也較為廣泛。多線程可以實(shí)現(xiàn)并行處理,避免了某項(xiàng)任務(wù)長(zhǎng)時(shí)間占用CPU時(shí)間。要說(shuō)明的一點(diǎn)是,目前大多數(shù)的計(jì)算機(jī)都是單處理器(CPU)的,為了運(yùn)行所有這些線程,操作系統(tǒng)為每個(gè)獨(dú)立線程安排一些CPU時(shí)間,操作系統(tǒng)以輪換方式向線程提供時(shí)間片,這就給人一種假象,好象這些線程都在同時(shí)運(yùn)行。由此可見(jiàn),如果兩個(gè)非?;钴S的線程為了搶奪對(duì)CPU的控制權(quán),在線程切
4、換時(shí)會(huì)消耗很多的CPU資源,反而會(huì)降低系統(tǒng)的性能。這一點(diǎn)在多線程編程時(shí)應(yīng)該注意。Win32SDK函數(shù)支持進(jìn)行多線程的程序設(shè)計(jì),并提供了操作系統(tǒng)原理中的各種同步、互斥和臨界區(qū)等操作。VisualC++6.0中,使用MFC類庫(kù)也實(shí)現(xiàn)了多線程的程序設(shè)計(jì),使得多線程編程更加方便。VC中提供線程同步的方法:臨界區(qū)(CCriticalSection)事件(CEvent)互斥量(CMutex)信號(hào)量(CSemaphore)A、使用CCriticalSection類 當(dāng)多個(gè)線程訪問(wèn)一個(gè)獨(dú)占性共享資源時(shí),可以使用“臨
5、界區(qū)”對(duì)象。任一時(shí)刻只有一個(gè)線程可以擁有臨界區(qū)對(duì)象,擁有臨界區(qū)的線程可以訪問(wèn)被保護(hù)起來(lái)的資源或代碼段,其他希望進(jìn)入臨界區(qū)的線程將被掛起等待,直到擁有臨界區(qū)的線程放棄臨界區(qū)時(shí)為止,這樣就保證了不會(huì)在同一時(shí)刻出現(xiàn)多個(gè)線程訪問(wèn)共享資源。CCriticalSection類的用法非常簡(jiǎn)單,步驟如下:定義CCriticalSection類的一個(gè)全局對(duì)象(以使各個(gè)線程均能訪問(wèn)),如CCriticalSectioncritical_section;在訪問(wèn)需要保護(hù)的資源或代碼之前,調(diào)用CCriticalSection類
6、的成員Lock()獲得臨界區(qū)對(duì)象:critical_section.Lock();在線程中調(diào)用該函數(shù)來(lái)使線程獲得它所請(qǐng)求的臨界區(qū)。如果此時(shí)沒(méi)有其它線程占有臨界區(qū)對(duì)象,則調(diào)用Lock()的線程獲得臨界區(qū);否則,線程將被掛起,并放入到一個(gè)系統(tǒng)隊(duì)列中等待,直到當(dāng)前擁有臨界區(qū)的線程釋放了臨界區(qū)時(shí)為止。訪問(wèn)臨界區(qū)完畢后,使用CCriticalSection的成員函數(shù)Unlock()來(lái)釋放臨界區(qū):critical_section.Unlock();再通俗一點(diǎn)講,就是線程A執(zhí)行到critical_section.L
7、ock();語(yǔ)句時(shí),如果其它線程(B)正在執(zhí)行critical_section.Lock();語(yǔ)句后且critical_section.Unlock();語(yǔ)句前的語(yǔ)句時(shí),線程A就會(huì)等待,直到線程B執(zhí)行完critical_section.Unlock();語(yǔ)句,線程A才會(huì)繼續(xù)執(zhí)行。B、使用CEvent類 CEvent類提供了對(duì)事件的支持。事件是一個(gè)允許一個(gè)線程在某種情況發(fā)生時(shí),喚醒另外一個(gè)線程的同步對(duì)象。例如在某些網(wǎng)絡(luò)應(yīng)用程序中,一個(gè)線程(記為A)負(fù)責(zé)監(jiān)聽(tīng)通訊端口,另外一個(gè)線程(記為B)負(fù)責(zé)更新用戶數(shù)
8、據(jù)。通過(guò)使用CEvent類,線程A可以通知線程B何時(shí)更新用戶數(shù)據(jù)。每一個(gè)CEvent對(duì)象可以有兩種狀態(tài):有信號(hào)狀態(tài)和無(wú)信號(hào)狀態(tài)。線程監(jiān)視位于其中的CEvent類對(duì)象的狀態(tài),并在相應(yīng)的時(shí)候采取相應(yīng)的操作?! ≡贛FC中,CEvent類對(duì)象有兩種類型:人工事件和自動(dòng)事件。一個(gè)自動(dòng)CEvent對(duì)象在被至少一個(gè)線程釋放后會(huì)自動(dòng)返回到無(wú)信號(hào)狀態(tài);而人工事件對(duì)象獲得信號(hào)后,釋放可利用線程,但直到調(diào)用成員函數(shù)ReSetEvent()才將其設(shè)置為無(wú)信號(hào)狀態(tài)。在創(chuàng)建CEv