資源描述:
《實(shí)驗(yàn)2-2windows2000 線程同步》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、實(shí)驗(yàn)2并發(fā)與調(diào)度????2.2Windows2000線程同步(實(shí)驗(yàn)估計(jì)時(shí)間:120分鐘)??背景知識(shí)?實(shí)驗(yàn)?zāi)康?工具/準(zhǔn)備工作?實(shí)驗(yàn)內(nèi)容與步驟?背景知識(shí)Windows2000提供的常用對(duì)象可分成三類:核心應(yīng)用服務(wù)、線程同步和線程間通訊。其中,開發(fā)人員可以使用線程同步對(duì)象來協(xié)調(diào)線程和進(jìn)程的工作,以使其共享信息并執(zhí)行任務(wù)。此類對(duì)象包括互鎖數(shù)據(jù)、臨界段、事件、互斥體和信號(hào)等。多線程編程中關(guān)鍵的一步是保護(hù)所有的共享資源,工具主要有互鎖函數(shù)、臨界段和互斥體等;另一個(gè)實(shí)質(zhì)性部分是協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),
2、為此,可利用內(nèi)核中的事件對(duì)象和信號(hào)。在進(jìn)程內(nèi)或進(jìn)程間實(shí)現(xiàn)線程同步的最方便的方法是使用事件對(duì)象,這一組內(nèi)核對(duì)象允許一個(gè)線程對(duì)其受信狀態(tài)進(jìn)行直接控制(見表4-1)。而互斥體則是另一個(gè)可命名且安全的內(nèi)核對(duì)象,其主要目的是引導(dǎo)對(duì)共享資源的訪問。擁有單一訪問資源的線程創(chuàng)建互斥體,所有想要訪問該資源的線程應(yīng)該在實(shí)際執(zhí)行操作之前獲得互斥體,而在訪問結(jié)束時(shí)立即釋放互斥體,以允許下一個(gè)等待線程獲得互斥體,然后接著進(jìn)行下去。與事件對(duì)象類似,互斥體容易創(chuàng)建、打開、使用并清除。利用CreateMutex()API可創(chuàng)建互斥
3、體,創(chuàng)建時(shí)還可以指定一個(gè)初始的擁有權(quán)標(biāo)志,通過使用這個(gè)標(biāo)志,只有當(dāng)線程完成了資源的所有的初始化工作時(shí),才允許創(chuàng)建線程釋放互斥體。?表4-1用于管理事件對(duì)象的APIAPI名稱描述CreateEvent()在內(nèi)核中創(chuàng)建一個(gè)新的事件對(duì)象。此函數(shù)允許有安全性設(shè)置、手工還是自動(dòng)重置的標(biāo)志以及初始時(shí)已接受還是未接受信號(hào)狀態(tài)的標(biāo)志OpenEvent()創(chuàng)建對(duì)已經(jīng)存在的事件對(duì)象的引用。此API函數(shù)需要名稱、繼承標(biāo)志和所需的訪問級(jí)別SetEvent()將手工重置事件轉(zhuǎn)化為已接受信號(hào)狀態(tài)ResetEvent()將手工重
4、置事件轉(zhuǎn)化為非接受信號(hào)狀態(tài)PulseEvent()將自動(dòng)重置事件對(duì)象轉(zhuǎn)化為已接受信號(hào)狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程時(shí)此種轉(zhuǎn)化立即發(fā)生?為了獲得互斥體,首先,想要訪問調(diào)用的線程可使用OpenMutex()API來獲得指向?qū)ο蟮木浔蝗缓?,線程將這個(gè)句柄提供給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥體對(duì)象發(fā)送給等待線程時(shí),就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對(duì)共享資源的訪問——必須設(shè)法盡快地放棄互斥體。放棄共享資源時(shí)需要在該對(duì)象上調(diào)用ReleaseMute()API。然后系統(tǒng)負(fù)責(zé)將互斥
5、體擁有權(quán)傳遞給下一個(gè)等待著的線程(由到達(dá)時(shí)間決定順序)。實(shí)驗(yàn)?zāi)康脑诒緦?shí)驗(yàn)中,通過對(duì)事件和互斥體對(duì)象的了解,來加深對(duì)Windows2000線程同步的理解。1)回顧系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows2000線程的理解。2)了解事件和互斥體對(duì)象。3)通過分析實(shí)驗(yàn)程序,了解管理事件對(duì)象的API。4)了解在進(jìn)程中如何使用事件對(duì)象。5)了解在進(jìn)程中如何使用互斥體對(duì)象。6)了解父進(jìn)程創(chuàng)建子進(jìn)程的程序設(shè)計(jì)方法。工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。您需要做以下準(zhǔn)備:1)一臺(tái)運(yùn)行Wind
6、ows2000Professional操作系統(tǒng)的計(jì)算機(jī)。2)計(jì)算機(jī)中需安裝VisualC++6.0專業(yè)版或企業(yè)版。實(shí)驗(yàn)內(nèi)容與步驟?1.事件對(duì)象2.互斥體對(duì)象1.事件對(duì)象清單2-1程序展示了如何在進(jìn)程間使用事件。父進(jìn)程啟動(dòng)時(shí),利用CreateEvent()API創(chuàng)建一個(gè)命名的、可共享的事件和子進(jìn)程,然后等待子進(jìn)程向事件發(fā)出信號(hào)并終止父進(jìn)程。在創(chuàng)建時(shí),子進(jìn)程通過OpenEvent()API打開事件對(duì)象,調(diào)用SetEvent()API使其轉(zhuǎn)化為已接受信號(hào)狀態(tài)。兩個(gè)進(jìn)程在發(fā)出信號(hào)之后幾乎立即終止。步驟1:登
7、錄進(jìn)入Windows2000Professional。步驟2:在“開始”菜單中單擊“程序”-“MicrosoftVisualStudio6.0”–“MicrosoftVisualC++6.0”命令,進(jìn)入VisualC++窗口。步驟3:在工具欄單擊“打開”按鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序2-1.cpp。清單2-1創(chuàng)建和打開事件對(duì)象在進(jìn)程間傳送信號(hào)//event項(xiàng)目#include#include?//以下是句柄事件。實(shí)際中很可能使用共享的包含文件來
8、進(jìn)行通訊staticLPCTSTRg_szContinueEvent="w2kdg.EventDemo.event.Continue";?//本方法只是創(chuàng)建了一個(gè)進(jìn)程的副本,以子進(jìn)程模式(由命令行指定)工作BOOLCreateChild(){//提取當(dāng)前可執(zhí)行文件的文件名TCHARszFilename[MAX_PATH];::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進(jìn)程的命令行,指明它是一個(gè)EXE文件和子