《 Windows xp 線程同》實(shí)驗(yàn)指導(dǎo)書(shū)(模板)_第1頁(yè)
《 Windows xp 線程同》實(shí)驗(yàn)指導(dǎo)書(shū)(模板)_第2頁(yè)
《 Windows xp 線程同》實(shí)驗(yàn)指導(dǎo)書(shū)(模板)_第3頁(yè)
《 Windows xp 線程同》實(shí)驗(yàn)指導(dǎo)書(shū)(模板)_第4頁(yè)
《 Windows xp 線程同》實(shí)驗(yàn)指導(dǎo)書(shū)(模板)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(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)介

1、實(shí)驗(yàn)3 Windows xp線程同步(實(shí)踐估計(jì)時(shí)間:100分鐘)Windowsxp提供的常用對(duì)象可分成三類(lèi):核心應(yīng)用服務(wù)、線程同步和線 程間通信,其中,開(kāi)發(fā)人員可以使用線程同步對(duì)象來(lái)協(xié)調(diào)線程和進(jìn)程的工 作,以使其共享信息并執(zhí)行任務(wù)。此類(lèi)對(duì)象包括互鎖數(shù)據(jù)、臨界區(qū)、事件、 互斥信號(hào)量等。多或程編程中關(guān)鍵的一步是保護(hù)所有的共享資源,工具主要有互鎖函數(shù)、 臨界區(qū)和互斥信號(hào)量等;另一個(gè)實(shí)質(zhì)性局部是協(xié)調(diào)線程使其完成應(yīng)用程序 的任務(wù),為此,可利用內(nèi)核中的事件對(duì)象和信號(hào)。在進(jìn)程內(nèi)或進(jìn)程間實(shí)現(xiàn)線程同步的最方便的方法是使用事件對(duì)象,這一組 內(nèi)核對(duì)象允許一個(gè)線程對(duì)其受信狀態(tài)進(jìn)行直接控制(見(jiàn)表3-1)。表3-1用于管

2、理事件對(duì)象API描述描述API名稱(chēng)CreateEvent()CreateEvent()OpenEvent0SetEvent()ResetEvent()在內(nèi)核中創(chuàng)立一個(gè)新的事件對(duì)象。此函數(shù)允許有 平安性設(shè)置、手工還是自動(dòng)重置的標(biāo)志以及初始 時(shí)已接收還是未接收信號(hào)狀態(tài)的標(biāo)志。創(chuàng)立對(duì)已經(jīng)存在的事件對(duì)象的引用。此API函數(shù) 需要名稱(chēng)、繼承標(biāo)志和所需的訪問(wèn)級(jí)別。將手工重置事件轉(zhuǎn)化為已接收信號(hào)狀態(tài)。將手工重置事件轉(zhuǎn)化為非接收信號(hào)狀態(tài)。PulseEvnt()將自動(dòng)重置事件對(duì)象轉(zhuǎn)化為已接收信號(hào)狀態(tài)。當(dāng) 系統(tǒng)釋放所有的等待它的線程時(shí)此種轉(zhuǎn)化立即發(fā) 生。與事件對(duì)象類(lèi)似,互斥信號(hào)量容易創(chuàng)立、翻開(kāi)、使用并清除。利用

3、CreateMutex()API函數(shù)可創(chuàng)立互斥信號(hào)量,創(chuàng)立時(shí)還可以指定一個(gè)初始的擁有 權(quán)標(biāo)志,通過(guò)使用這個(gè)標(biāo)志,只有當(dāng)線程完成了資源的所有的初始化工作時(shí), 才允許創(chuàng)立線程釋放互斥信號(hào)量。為了獲得互斥信號(hào)量,首先,想要訪問(wèn)調(diào)用的線程可使用 OpenMutex()API函數(shù)來(lái)獲得指向?qū)ο蟮木浔蝗缓?,線程將這個(gè)句柄提供 給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥信號(hào)量對(duì)象發(fā)送給等待線程時(shí),就說(shuō)明該線 程獲得了互斥信號(hào)量的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對(duì)共享資 源的訪問(wèn)一一必須設(shè)法盡快地放棄互斥信號(hào)量。放棄共享資源時(shí)需要在該對(duì) 象上調(diào)用ReleaseMutex()API。然后系統(tǒng)負(fù)責(zé)將互斥信號(hào)量擁有權(quán)傳遞

4、給下 一個(gè)等待著的線程(由到達(dá)時(shí)間決定順序)。3.1實(shí)踐目的在本實(shí)踐中,通過(guò)對(duì)事件和互斥信號(hào)量對(duì)象的了解,加深對(duì)Windows xp 線程同步的理解。1)回顧系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows xp的理解。2) 了解事件和互斥信號(hào)量對(duì)象。/發(fā)出訪問(wèn)信號(hào)并允許線程切換-m_n Access;:Sleep(lOOO);/釋放對(duì)數(shù)值的訪問(wèn):ReleaseMutex(m_hMutexValue);static DWORD WINAPI IncThreadProc(LPVOID IpParam) (/將參數(shù)解釋為“this”指針CCountUpDown*pThis=reinterpret_c

5、ast(lpParam);/調(diào)用對(duì)象的增加方法并返回一個(gè)值 pThis - DoCount(+l);return(O);)static DWORD WINAPI DecThreadProc(LPVOID IpParam) (/將參數(shù)解釋為“this”指針CCountUpDown* pThis =reinterpret_cast(lpParam);/調(diào)用對(duì)象的減少方法并返回一個(gè)值pThis - DoCount(-l); return(O);protected:HANDLE m hThreadlnc;HANDLE m hThreadDec;HANDLE m hMutexValue; int m_n

6、Value;int m nAccess;void main()CCountUpDown ud(50); ud.WailForCompletion();步驟4:在工具欄單擊“Executeprogram”按鈕,執(zhí)行3-2.exe程序。請(qǐng) 描述運(yùn)行結(jié)果(如果運(yùn)行不成功,那么可能的原因是什么?):10113)通過(guò)分析實(shí)踐程序,了解管理事件對(duì)象的APL了解在進(jìn)程中如何使用事件對(duì)象。了解在進(jìn)程中如何使用互斥信號(hào)量對(duì)象。了解父進(jìn)程創(chuàng)立子進(jìn)程的程序設(shè)計(jì)方法。工具/準(zhǔn)備工作在開(kāi)始本實(shí)踐之前,請(qǐng)回顧教科書(shū)的相關(guān)內(nèi)容。您需要做以下準(zhǔn)備:一臺(tái)運(yùn)行Windows xp Professional操作系統(tǒng)的計(jì)算機(jī)。2)計(jì)

7、算機(jī)中需安裝Visual C+6.0專(zhuān)業(yè)版或企業(yè)版。實(shí)踐內(nèi)容與步驟.事件對(duì)象在進(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)程通過(guò)OpenEvent()API翻開(kāi)事件對(duì)象,調(diào)用SetEvent()API使其 轉(zhuǎn)化為已接收信號(hào)狀態(tài)。兩個(gè)進(jìn)程在發(fā)出信號(hào)之后幾乎立即終止。痢聚 1 :登錄進(jìn)入 Windows xp Professional 步驟2:在“開(kāi)始”菜單中單擊“程序、Microsoft Visual Studio 6.0 Microsoft Visual C+ 6.0v ,進(jìn)入 V

8、isual C+窗口。步驟3:在工具欄單擊“新建”按鈕,編寫(xiě)代碼保存為3-l.cppo程序功能:創(chuàng)立和翻開(kāi)事件對(duì)象在進(jìn)程間傳送信號(hào)。參考類(lèi)和函數(shù):windows、iostream CreateChild() szFilename GetModuleFileName szCmdLine CloseHandle WaitForChild()o參考代碼:/ event 工程include include /以下是句柄事件。實(shí)際中很可能使用共享的包含文件來(lái)進(jìn)行通訊static LPCTSTR g_szContinueEvent =w2kdg.EventDemo. event. Continue”;/本

9、方法只是創(chuàng)立了一個(gè)進(jìn)程的副本,以子進(jìn)程模式(由命令行指定)工作 BOOL CreateChild()(/提取當(dāng)前可執(zhí)行文件的文件名TCHAR szFilenameMAX_PATH;:GetModuleFileName(NULL, szFilename, MAX_PATH);/格式化用于子進(jìn)程的命令行,指明它是一個(gè)EXE文件和子進(jìn)程TCHAR szCmdLineMAX_PATH;:sprintf(szCmdLine, nn%snchildn, szFilename);/子進(jìn)程的啟動(dòng)信息結(jié)構(gòu)STARTUPINFO si;:ZeroMemory(reinterpret_cast(&si), size

10、of(si);si.cb = sizeof(si);si.cb = sizeof(si);/必須是本結(jié)構(gòu)的大小/返回的子進(jìn)程的進(jìn)程信息結(jié)構(gòu)PROCESSJNFORMATION pi;/使用同一可執(zhí)行文件和告訴它是一個(gè)子進(jìn)程的命令行創(chuàng)立進(jìn)程BOOLbCreateOK =:CreateProcess(/返回的子進(jìn)程的進(jìn)程信息結(jié)構(gòu)PROCESSJNFORMATION pi;/使用同一可執(zhí)行文件和告訴它是一個(gè)子進(jìn)程的命令行創(chuàng)立進(jìn)程BOOLbCreateOK =:CreateProcess(szFilename, szCmdLine, NULL, NULL, FALSE, 。, NULL, NULL,&

11、si, &pi);/釋放對(duì)子進(jìn)程的引用 if (bCreateOK)/生成的可執(zhí)行文件名/指示其行為與子進(jìn)程一樣的標(biāo)志/子進(jìn)程句柄的平安性/子線程句柄的平安性/不繼承句柄特殊的創(chuàng)立標(biāo)志/新環(huán)境/當(dāng)前目錄/啟動(dòng)信息結(jié)構(gòu)/返回的進(jìn)程信息結(jié)構(gòu):CloseHandle(pi.hProcess);:CloseHandle(pi.hThread);)return(bCreateOK);/下面的方法創(chuàng)立一個(gè)事件和一個(gè)子進(jìn)程,然后等待子進(jìn)程在返回前向事件發(fā)出 信號(hào)void WaitForChild()/ create a new event object for the child process/ to u

12、se when releasing this processHANDLE hEventContinue = : CreateEvent(NULL,/缺省的平安性,子進(jìn)程將具有訪問(wèn)權(quán)限TRUE,/手工重置事件FALSE,/初始時(shí)是非接受信號(hào)狀態(tài)g_szContinueEvent); / 事件名稱(chēng) if (hEventContinue != NULL)std : cout nevent created std : endl;/創(chuàng)立子進(jìn)程if(: CreateChildO)std : cout ” chlid created std : endl;/等待,直到子進(jìn)程發(fā)出信號(hào)std : cout ”P(pán)

13、arent waiting on child. std : endl;:WaitForSingleObject(hEventContinue, INFINITE);:Sleep(1500);/刪除這句試試std : cout ”parent received the envent signaling from child” std : endl;)/清除句柄:CloseHandle(hEventContinue);hEventContinue=INVALID HANDLE VALUE;)/以下方法在子進(jìn)程模式下被調(diào)用,其功能只是向父進(jìn)程發(fā)出終止信號(hào)void SignalParent()/嘗試翻

14、開(kāi)句柄std : cout child process begining“ std : endl; HANDLE hEventContinue =:OpenEvent(/所要求的最小訪問(wèn)權(quán)限/不是可繼承的句柄/事件名稱(chēng)EVENT_MODIFY_STATE, FALSE, g_szContinueEvent); if(hEventContinue ! = NULL):SetEvent(hEventContinue);std : cout ”event signaledn std : endl;)/清除句柄:CloseHandle(hEventContinue); hEventContinue =

15、INVALID_HANDLE_VALUE;)int main(int argc, char* argv)/檢查父進(jìn)程或是子進(jìn)程是否啟動(dòng)if (argcl & : strcmp(argvl, child )= 0)/向父進(jìn)程創(chuàng)立的事件發(fā)出信號(hào) :SignalParent();else/創(chuàng)立一個(gè)事件并等待子進(jìn)程發(fā)出信號(hào):WaitForChild();:Sleep(1500);std : cout Parent released. std : endl;return 0;)步驟4:?jiǎn)螕簟癇uild”菜單中的“Compile 3-1.cpp”命令,單擊“是”按鈕確認(rèn),系統(tǒng)對(duì)3-Lcpp進(jìn)行編譯。步驟5

16、:編譯完成后,單擊“Build”菜單中的“Build3-l.exe”命令,建立 3-l.exe可執(zhí)行文件。操作能否正常進(jìn)行,如果不行,原因是什么?步驟6:在工具欄單擊uExecute program按鈕,執(zhí)行3-l.exe程序。運(yùn) 行結(jié)果(分行書(shū)寫(xiě),如果不成功,原因是什么?):這個(gè)結(jié)果與你期望的一致嗎?(從進(jìn)程并發(fā)的角度對(duì)結(jié)果進(jìn)行分析)。請(qǐng) 回答:1)程序中,創(chuàng)立一個(gè)事件使用了哪一個(gè)系統(tǒng)函數(shù)?創(chuàng)立時(shí)設(shè)置的初始信號(hào)狀態(tài)是什么?2)創(chuàng)立一個(gè)進(jìn)程(子進(jìn)程)使用了哪一個(gè)系統(tǒng)函數(shù)?2.互斥信號(hào)量對(duì)象使用互斥信號(hào)量來(lái)保證對(duì)兩個(gè)線程間單一數(shù)值的訪問(wèn)。每個(gè)線程都企圖獲得控 制權(quán)來(lái)改變?cè)摂?shù)值,然后將該數(shù)值寫(xiě)入輸

17、出流中。創(chuàng)立者實(shí)際上創(chuàng)立的是互斥信 號(hào)量對(duì)象,計(jì)數(shù)方法執(zhí)行等待并釋放,為的是共同使用互斥信號(hào)量所需的資源(因 而也就是共享資源)步驟1:在工具欄單擊“新建”按鈕,編寫(xiě)代碼保存為3-2.cppo程序功能:利用互斥信號(hào)量保護(hù)共享資源參考類(lèi)與函數(shù):windows.h iostream class CCountUpDownWaitForCompletion() DoCount() ReleaseMutex()步驟2:?jiǎn)螕簟癇uild”菜單中的“Compile 3-2.cpp”命令,再單擊“是” 按鈕確認(rèn),系統(tǒng)對(duì)3-2.cpp進(jìn)行編譯。步驟3:編譯完成后,單擊“Build”菜單中的“Build3-2.e

18、xe”命令,建立3-2.exe可執(zhí)行文件。操作能否正常進(jìn)行,如果不行,原因是什么?參考代碼:/ mutex 工程include include /利用互斥體來(lái)保護(hù)同時(shí)訪問(wèn)的共享資源class CCountUpDown(public:/創(chuàng)立者創(chuàng)立兩個(gè)線程來(lái)訪問(wèn)共享值CCountUpDown(int nAccesses): m_hThreadInc(INVALID_HANDLE_VALUE), m_hThreadDec(INVALID_HANDLE_VALUE), m_hMutexValue(INVALID_HANDLE_VALUE), m_nValue(0)9 m_nAccess(nAccess

19、es)/創(chuàng)立互斥體用于訪問(wèn)數(shù)值m_hMutexV alue=: :CreateMutex(NULL,/缺省的平安性結(jié)束時(shí)將釋放TRUE, /初始時(shí)擁有,在所有的初始化NULL);/匿名的m_hThreadInc=: :CreateThread(NULL,/缺省的平安性0,/缺省堆棧IncThreadProc, / 類(lèi)線程進(jìn)程 reinterpret_cast(this), /線程參數(shù)0,/無(wú)特殊的標(biāo)志NULL);/忽略返回的idm_hrhreadDec=:Createrhread(NULL,/缺省的平安性0,/缺省堆棧DecThreadProc,/類(lèi)線程進(jìn)程reinterpret_cast(this)/線程參數(shù)0,/無(wú)特殊的標(biāo)志NULL);/忽略返回的id/允許另一線程獲得互斥體:ReleaseMutex(m_hMutexValue)

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論