




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、姓名:賈璐萍班級(jí):信息管理與信息系統(tǒng) 學(xué)號(hào):41012238 日期:2012-10-27實(shí)驗(yàn)一 Windows 2000進(jìn)程的“一生”一、 實(shí)驗(yàn)題目Windows 2000進(jìn)程的“一生二、 實(shí)驗(yàn)?zāi)康?) 通過創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windows 2000進(jìn)程的“一生”。2) 通過閱讀和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)方法。三、 實(shí)驗(yàn)內(nèi)容1.1 創(chuàng)建進(jìn)程1) 調(diào)試實(shí)驗(yàn)3-5中的程序2) 觀察并分析程序1.2正在運(yùn)行的進(jìn)程1) 調(diào)試實(shí)驗(yàn)3-6中的程序2) 觀察并分析程序四、 實(shí)驗(yàn)過程及結(jié)果1.1步驟1:
2、登錄進(jìn)入Windows 2000 Professional。步驟2:在“開始”菜單中單擊“程序”-“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”命令,進(jìn)入Visual C+窗口。步驟3:在工具欄單擊“打開”按鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序3-5.cpp。步驟4:單擊“Build”菜單中的“Compile 3-5.cpp”命令編輯3-5.cpp步驟5:編譯完成后,單擊“Build”菜單中的“Build 3-5.exe”命令,建立3-5.exe可執(zhí)行文件。步驟6:在工具欄單擊“Execute Program”(執(zhí)行程序) 按
3、鈕,或者按Ctrl + F5鍵,或者單擊“Build”菜單中的“Execute 3-5.exe”命令,執(zhí)行3-5.exe程序。步驟7:按Ctrl + S鍵可暫停程序的執(zhí)行,按Ctrl + Pause (Break) 鍵可終止程序的執(zhí)行。實(shí)驗(yàn)源代碼/ proccreate項(xiàng)目#include <windows.h>#include <iostream>#include <stdio.h>/ 創(chuàng)建傳遞過來的進(jìn)程的克隆過程并賦于其ID值void StartClone(int nCloneID) / 提取用于當(dāng)前可執(zhí)行文件的文件名 TCHAR szFilenameM
4、AX_PATH ; : GetModuleFileName(NULL, szFilename, MAX_PATH) ; / 格式化用于子進(jìn)程的命令行并通知其EXE文件名和克隆ID TCHAR szCmdLineMAX_PATH;: sprintf(szCmdLine,""%s" d%",szFilename,nCloneID);/ 用于子進(jìn)程的STARTUPINFO結(jié)構(gòu) STARTUPINFO si; : ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ; si.cb
5、= sizeof(si) ;/ 必須是本結(jié)構(gòu)的大小 / 返回的用于子進(jìn)程的進(jìn)程信息 PROCESS_INFORMATION pi; / 利用同樣的可執(zhí)行文件和命令行創(chuàng)建進(jìn)程,并賦于其子進(jìn)程的性質(zhì) BOOL bCreateOK=:CreateProcess( szFilename,/ 產(chǎn)生這個(gè)EXE的應(yīng)用程序的名稱 szCmdLine,/ 告訴其行為像一個(gè)子進(jìn)程的標(biāo)志 NULL,/ 缺省的進(jìn)程安全性 NULL,/ 缺省的線程安全性 FALSE,/ 不繼承句柄 CREATE_NEW_CONSOLE,/ 使用新的控制臺(tái) NULL,/ 新的環(huán)境 NULL,/ 當(dāng)前目錄 &si,/ 啟動(dòng)信息 &
6、amp;pi) ;/ 返回的進(jìn)程信息 / 對(duì)子進(jìn)程釋放引用 if (bCreateOK) : CloseHandle(pi.hProcess) ; : CloseHandle(pi.hThread) ; int main(int argc, char* argv ) / 確定進(jìn)程在列表中的位置 int nClone(0) ; if (argc > 1) / 從第二個(gè)參數(shù)中提取克隆ID : sscanf(argv1 , "%d" , &nClone) ; / 顯示進(jìn)程位置 std : cout << "Process ID:" &
7、lt;< : GetCurrentProcessId() << ", Clone ID:" << nClone << std : endl; / 檢查是否有創(chuàng)建子進(jìn)程的需要 const int c_nCloneMax=25; if (nClone < c_nCloneMax) / 發(fā)送新進(jìn)程的命令行和克隆號(hào) StartClone(+nClone) ; / 在終止之前暫停一下 (l/2秒) : Sleep(500) ; return 0;1.2步驟1:在Visual C+ 窗口的工具欄中單擊“打開”按鈕,在“打開”對(duì)話框中找到并
8、打開實(shí)驗(yàn)源程序3-6.cpp。步驟2:單擊“Build”菜單中的“Compile 3-6.cpp”命令,再單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)3-6.cpp進(jìn)行編譯。步驟3:編譯完成后,單擊“Build”菜單中的“Build 3-6.exe”命令,建立3-6.exe可執(zhí)行文件。 步驟4:在工具欄單擊“Execute Program” (執(zhí)行程序) 按鈕,執(zhí)行3-6.exe程序。步驟5:單擊Ctrl + Alt + Del鍵,進(jìn)入“Windows任務(wù)管理器”,在“應(yīng)用程序”選項(xiàng)卡中右鍵單擊“3-6”任務(wù),在快捷菜單中選擇“轉(zhuǎn)到進(jìn)程”命令。實(shí)驗(yàn)源代碼/ version項(xiàng)目#include <windo
9、ws.h>#include <iostream>/ 利用進(jìn)程和操作系統(tǒng)的版本信息的簡單示例void main() / 提取這個(gè)進(jìn)程的ID號(hào) DWORD dwIdThis=: GetCurrentProcessId(); / 獲得這一進(jìn)程和報(bào)告所需的版本,也可以發(fā)送0以便指明這一進(jìn)程 DWORD dwVerReq=: GetProcessVersion(dwIdThis); WORD wMajorReq=(WORD)(dwVerReq>16) ; WORD wMinorReq=(WORD)(dwVerReq & 0xffff) ; std : cout <&
10、lt; "Process ID: "<< dwIdThis <<", requires OS: " << wMajorReq << wMinorReq << std : endl ; / 設(shè)置版本信息的數(shù)據(jù)結(jié)構(gòu),以便保存操作系統(tǒng)的版本信息 OSVERSIONINFOEX osvix; : ZeroMemory(&osvix, sizeof(osvix) ) ; osvix.dwOSVersionInfoSize=sizeof(osvix) ; / 提取版本信息和報(bào)告 : GetVersi
11、onEx(reinterpret_cast < LPOSVERSIONINFO > (&osvix) ; std : cout << "Running on OS:" << osvix.dwMajorVersion <<"." << osvix.dwMinorVersion << std : endl; / 如果是NTS(Windows 2000) 系統(tǒng),則提高其優(yōu)先權(quán) if (osvix.dwPlatformId=VER_PLATFORM_WIN32_NT &&am
12、p; osvix.dwMajorVersion >= 5) / 改變優(yōu)先級(jí) : SetPriorityClass( : GetCurrentProcess() ,/ 利用這一進(jìn)程 HIGH_PRIORITY_CLASS);/ 改變?yōu)閔igh / 報(bào)告給用戶 std:cout << "Task Manager should now indicate this " "process is high priority."<< std : endl; 五、 回答問題1.11)(結(jié)合背景知識(shí)回答)該程序中使用的CreateProces
13、s() API函數(shù),此函數(shù)的大多數(shù)參數(shù)都可取缺省值,但是創(chuàng)建標(biāo)志參數(shù)使用了:_ CREATE-NEW-CONSOLE (CreateProcess( )的第六個(gè)參數(shù)) 標(biāo)志,指示新進(jìn)程分配它自己的控制臺(tái),這使得運(yùn)行示例程序時(shí),在任務(wù)欄上產(chǎn)生許多活動(dòng)標(biāo)記。然后該克隆進(jìn)程的創(chuàng)建方法關(guān)閉傳遞過來的句柄并返回main() 函數(shù)。在關(guān)閉程序之前,每一進(jìn)程的執(zhí)行主線程暫停一下,以便讓用戶看到其中的至少一個(gè)窗口。2)CreateProcess() 函數(shù)有_10_個(gè)核心參數(shù)?本實(shí)驗(yàn)程序中設(shè)置的各個(gè)參數(shù)的值是:_ 第一個(gè)參數(shù)值為:szFilename 第二個(gè)參數(shù)值為:szCmdLine 第五個(gè)參數(shù)值為:FALS
14、E 第六個(gè)參數(shù)值為:CREATE-NEW-CONSOLE 第九個(gè)參數(shù)值為:&si 第十個(gè)參數(shù)值為:&pi 第三、四、七、八個(gè)參數(shù)的值都為缺省值。 3)部分程序在Visual C+環(huán)境完成編譯、鏈接之后,還可以在Windows 2000的“命令提示符”狀態(tài)下嘗試執(zhí)行該程序,看看與在可視化界面下運(yùn)行的結(jié)果有沒有不同?為什么1.21)分析清單3-6中的程序,簡述該程序是如何獲得當(dāng)前的PID和所需的進(jìn)程版本信息?答:首先利用GetCurrentProcessId( )獲得進(jìn)程的ID號(hào),再用GetVersionEx( )提取定義為OSVERSION結(jié)構(gòu)的osvix變量中的操作系統(tǒng)版本信息
15、。最后打印出程序所用到的操作系統(tǒng)的版本信息。2)在本程序中用到了哪些主要Windows API函數(shù)?答:主要用到的API函數(shù)是GetProcessVersion( )與GetVersionEx( ),這兩個(gè)函數(shù)可確定運(yùn)行進(jìn)程的操作系統(tǒng)的版本號(hào)。六、 實(shí)驗(yàn)總結(jié)(包括實(shí)驗(yàn)中遇到的問題及解決方法,還存在的問題,通過本次實(shí)驗(yàn)學(xué)到些什么等)1)通過創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解windows2000運(yùn)行過程2)初步學(xué)習(xí)了創(chuàng)建進(jìn)程、觀察進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)方法,加深對(duì)進(jìn)程的理解和記憶。3)函數(shù)之間的作用及意義理解不到,導(dǎo)致其用法不熟悉實(shí)驗(yàn)
16、二、事件對(duì)象一、 實(shí)驗(yàn)題目事件對(duì)象二、 實(shí)驗(yàn)?zāi)康?回顧系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows 2000線程的理解2了解事件對(duì)象3通過分析實(shí)驗(yàn)程序,了解管理事件對(duì)象的API4了解在進(jìn)程中如何使用事件對(duì)象5了解父進(jìn)程創(chuàng)建子進(jìn)程的程序設(shè)計(jì)方法三、 實(shí)驗(yàn)內(nèi)容1調(diào)試實(shí)驗(yàn)(二)中的程序。2觀察并分析程序。四、 實(shí)驗(yàn)過程及結(jié)果步驟1:登錄進(jìn)入Windows 2000 Professional。步驟2:在“開始”菜單中單擊“程序”-“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”命令,進(jìn)入Visual C+窗口。步驟3:在工具欄單擊“打開”按
17、鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序4-1.cpp步驟4:單擊“Build”菜單中的“Compile 4-1.cpp”命令,并單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)4-1.cpp進(jìn)行編譯。步驟5:編譯完成后,單擊“Build”菜單中的“Build 4-1.exe”命令,建立4-1.exe可執(zhí)行文件。步驟6:在工具欄單擊“Execute Program” (執(zhí)行程序) 按鈕,執(zhí)行4-1.exe程序。實(shí)驗(yàn)源代碼/ event項(xiàng)目# include <windows.h># include <iostream>/ 以下是句柄事件。實(shí)際中很可能使用共享的包含文件來進(jìn)行通訊static
18、 LPCTSTR g_szContinueEvent ="w2kdg.EventDemo.event.Continue"/ 本方法只是創(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, "
19、"%s"child" , szFilename) ; / 子進(jìn)程的啟動(dòng)信息結(jié)構(gòu) STARTUPINFO si; : ZeroMemory(reinterpret_cast<void*>(&si), sizeof(si) ; si.cb = sizeof(si);/ 必須是本結(jié)構(gòu)的大小 / 返回的子進(jìn)程的進(jìn)程信息結(jié)構(gòu) PROCESS_INFORMATION pi; / 使用同一可執(zhí)行文件和告訴它是一個(gè)子進(jìn)程的命令行創(chuàng)建進(jìn)程 BOOL bCreateOK = : CreateProcess(szFilename,/ 生成的可執(zhí)行文件名szCmdLi
20、ne, / 指示其行為與子進(jìn)程一樣的標(biāo)志 NULL,/ 子進(jìn)程句柄的安全性 NULL,/ 子線程句柄的安全性 FALSE,/ 不繼承句柄 0,/ 特殊的創(chuàng)建標(biāo)志 NULL,/ 新環(huán)境 NULL,/ 當(dāng)前目錄 &si,/ 啟動(dòng)信息結(jié)構(gòu) &pi ) ;/ 返回的進(jìn)程信息結(jié)構(gòu) / 釋放對(duì)子進(jìn)程的引用 if (bCreateOK) : CloseHandle(pi.hProcess); : CloseHandle(pi.hThread); return(bCreateOK) ;/ 下面的方法創(chuàng)建一個(gè)事件和一個(gè)子進(jìn)程,然后等待子進(jìn)程在返回前向事件發(fā)出信號(hào)void WaitForChild
21、() / create a new event object for the child process / to use when releasing this process HANDLE hEventContinue = : CreateEvent( NULL,/ 缺省的安全性,子進(jìn)程將具有訪問權(quán)限 TRUE,/ 手工重置事件 FALSE,/ 初始時(shí)是非接受信號(hào)狀態(tài) g_szContinueEvent);/ 事件名稱 if (hEventContinue != NULL)std : cout << "event created " << std
22、 : endl;/ 創(chuàng)建子進(jìn)程 if (: CreateChild() std : cout << " chlid created" << std : endl; / 等待,直到子進(jìn)程發(fā)出信號(hào) std : cout << "Parent waiting on child." << std : endl; : WaitForSingleObject(hEventContinue, INFINITE); : Sleep(1500);std : cout << "parent receive
23、d the envent signaling from child" << std : endl; / 清除句柄 : CloseHandle(hEventContinue); hEventContinue=INVALID_HANDLE_VALUE; / 以下方法在子進(jìn)程模式下被調(diào)用,其功能只是向父進(jìn)程發(fā)出終止信號(hào)void SignalParent() / 嘗試打開句柄std : cout << "child process begining." << std : endl; HANDLE hEventContinue = : O
24、penEvent( EVENT_MODIFY_STATE,/ 所要求的最小訪問權(quán)限 FALSE,/ 不是可繼承的句柄 g_szContinueEvent);/ 事件名稱 if(hEventContinue != NULL) std : cout << "event signaled" << std : endl; / 清除句柄 : CloseHandle(hEventContinue) ; hEventContinue = INVALID_HANDLE_VALUE;int main(int argc, char* argv ) / 檢查父進(jìn)程或是子進(jìn)
25、程是否啟動(dòng) if (argc>1 && : strcmp(argv1 , "child" )= 0) / 向父進(jìn)程創(chuàng)建的事件發(fā)出信號(hào) : SignalParent() ; else / 創(chuàng)建一個(gè)事件并等待子進(jìn)程發(fā)出信號(hào) : Sleep(1500); std : cout << "Parent released." << std : endl ; return 0;五、 回答問題1兩個(gè)Sleep(1500)作用是否一樣?刪除它們可以嗎?為什么?答:兩個(gè)Sleep(1500)作用不一樣。第一個(gè)Sleep(1500
26、)保證了windows線程之間的切換,不可以刪除。若刪除,則不進(jìn)程可能等不到子進(jìn)程發(fā)送的信號(hào)就被釋放了;第二個(gè)Sleep(1500)起到延時(shí)的作用,可以刪除。2說明WaitForSingleObject()的用法以及其作用答:用法:WaitForSingleObject(hEvent,INFINITE)表示無限等待hEvent信號(hào)。返回值有三個(gè)。一個(gè)是wait-abandoneo:被指定的互斥體對(duì)象未被另一個(gè)線程釋放:一個(gè)是wait-object-o:被指定的對(duì)象已經(jīng)發(fā)送信號(hào);一個(gè)是:wait-timeout:超時(shí)。作用:若無信號(hào),則說明另一個(gè)線程正在訪問緩沖區(qū);若有信號(hào),則本線程可以訪問緩沖
27、區(qū),當(dāng)該函數(shù)在返回后會(huì)自動(dòng)把該信號(hào)置為無信號(hào)的,這樣在本線程讀寫緩沖區(qū)時(shí)別的線程不會(huì)同時(shí)訪問。在完成讀寫操作后,需要調(diào)用SetEvent()函數(shù)把該信號(hào)置為有信號(hào)的,以使別的線程有機(jī)會(huì)訪問共享緩沖區(qū)。3程序中創(chuàng)建一個(gè)事件使用了哪一個(gè)系統(tǒng)函數(shù)?創(chuàng)建時(shí)設(shè)置的初始信號(hào)狀態(tài)是什么?答:CreateEvent(),初始信號(hào)狀態(tài)是:非接受信號(hào)狀態(tài)。4創(chuàng)建一個(gè)進(jìn)程(子進(jìn)程)使用了哪一個(gè)系統(tǒng)函數(shù)答:CreateChild()5同步對(duì)象傳遞信號(hào)時(shí),為什么直接傳遞同步對(duì)象的句柄就可以了答:同一進(jìn)程中的線程之間共享同一張內(nèi)核對(duì)象表,同一個(gè)同步對(duì)象的句柄對(duì)各線程來說都是有效的,所以傳遞時(shí)只要直接傳句柄值就行了。6寫出
28、程序運(yùn)行的流程答:步1:檢查父進(jìn)程或是子進(jìn)程是否啟動(dòng)。步2:若父進(jìn)程啟動(dòng)則父進(jìn)程等待子進(jìn)程發(fā)送信號(hào);若未啟動(dòng)則創(chuàng)建一個(gè)事件后,等待子進(jìn)程發(fā)送信號(hào)。步3:釋放信號(hào)六、 實(shí)驗(yàn)總結(jié)(包括實(shí)驗(yàn)中遇到的問題及解決方法,還存在的問題,通過本次實(shí)驗(yàn)學(xué)到些什么等)1)了解事件對(duì)象、管理事件對(duì)象的API及在進(jìn)程中如何使用事件對(duì)象2)了解父進(jìn)程創(chuàng)建子進(jìn)程的程序設(shè)計(jì)方法3) 對(duì)整個(gè)程序的分析認(rèn)識(shí)不夠?qū)嶒?yàn)三、互斥體對(duì)象一、 實(shí)驗(yàn)題目互斥對(duì)象二、 實(shí)驗(yàn)?zāi)康?了解互斥體對(duì)象。2了解在進(jìn)程中如何使用互斥體對(duì)象三、 實(shí)驗(yàn)內(nèi)容1調(diào)試實(shí)驗(yàn)(三)中的程序。2觀察并分析程序。四、 實(shí)驗(yàn)過程及結(jié)果步驟1:登錄進(jìn)入Windows 200
29、0 Professional。步驟2:在“開始”菜單中單擊“程序”-“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”命令,進(jìn)入Visual C+窗口。步驟3:在工具欄單擊“打開”按鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序4-2.cpp步驟4:單擊“Build”菜單中的“Compile 4-2.cpp”命令,并單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)4-2.cpp進(jìn)行編譯。步驟5:編譯完成后,單擊“Build”菜單中的“Build 4-2exe”命令,建立4-2.exe可執(zhí)行文件。步驟6:在工具欄單擊“Execute Program” (執(zhí)行程序)
30、 按鈕,執(zhí)行4-2.exe程序?qū)嶒?yàn)源代碼/ mutex項(xiàng)目# include <windows.h># include <iostream>/ 利用互斥體來保護(hù)同時(shí)訪問的共享資源class CCountUpDownpublic: / 創(chuàng)建者創(chuàng)建兩個(gè)線程來訪問共享值CCountUpDown(int nAccesses): m_hThreadInc(INVALID_HANDLE_VALUE), m_hThreadDec(INVALID_HANDLE_VALUE), m_hMutexValue(INVALID_HANDLE_VALUE), m_nValue(0), m_nAc
31、cess(nAccesses)/ 創(chuàng)建互斥體用于訪問數(shù)值m_hMutexValue=:CreateMutex(NULL,/ 缺省的安全性TRUE,/ 初始時(shí)擁有,在所有的初始化結(jié)束時(shí)將釋放NULL); / 匿名的m_hThreadInc=:CreateThread(NULL,/ 缺省的安全性0,/ 缺省堆棧IncThreadProc,/ 類線程進(jìn)程reinterpret_cast<LPVOID>(this) ,/ 線程參數(shù)0,/ 無特殊的標(biāo)志NULL);/ 忽略返回的id m_hThreadDec=:CreateThread(NULL,/ 缺省的安全性0,/ 缺省堆棧DecThre
32、adProc,/ 類線程進(jìn)程reinterpret_cast<LPVOID>(this) ,/ 線程參數(shù)0,/ 無特殊的標(biāo)志NULL);/ 忽略返回的id / 允許另一線程獲得互斥體 :ReleaseMutex(m_hMutexValue); / 解除程序釋放對(duì)對(duì)象的引用virtual CCountUpDown():CloseHandle(m_hThreadInc); :CloseHandle(m_hThreadDec);:CloseHandle(m_hMutexValue); / 簡單的等待方法,在兩個(gè)線程終止之前可暫停主調(diào)者virtual void WaitForComplet
33、ion()/ 確保所有對(duì)象都已準(zhǔn)備好if (m_hThreadInc!=INVALID_HANDLE_VALUE && m_hThreadDec!=INVALID_HANDLE_VALUE)/ 等待兩者完成 (順序并不重要):WaitForSingleObject(m_hThreadInc, INFINITE);:WaitForSingleObject(m_hThreadDec, INFINITE);protected:/ 改變共享資源的簡單的方法virtual void DoCount(int nStep)/ 循環(huán),直到所有的訪問都結(jié)束為止while (m_nAccess &
34、gt; 0)/ 等待訪問數(shù)值: WaitForSingleObject(m_hMutexValue, INFINITE);/ 改變并顯示該值m_nValue+=nStep;std : cout << "thread:" << : GetCurrentThreadId()<<" value:"<<m_nValue<<" access:" << m_nAccess << std : endl;: Sleep(1000);static DWORD WINAP
35、I IncThreadProc(LPVOID lpParam)/ 將參數(shù)解釋為 "this" 指針CCountUpDown* pThis=reinterpret_cast<CCountUpDown*>(lpParam);/ 調(diào)用對(duì)象的增加方法并返回一個(gè)值pThis -> DoCount(+1);return(0);static DWORD WINAPI DecThreadProc(LPVOID lpParam)/ 將參數(shù)解釋為"this"指針CCountUpDown* pThis = reinterpret_cast<CCount
36、UpDown*>(lpParam);/ 調(diào)用對(duì)象的減少方法并返回一個(gè)值pThis -> DoCount(-1);return(0);protected:HANDLE m_hThreadInc;HANDLE m_hThreadDec;HANDLE m_hMutexValue;int m_nValue;int m_nAccess; ;void main()CCountUpDown ud(50);ud.WaitForCompletion();五、 回答問題1Mutex對(duì)象的狀態(tài)在它不被任何現(xiàn)程擁有時(shí)是有信號(hào)還是無信號(hào)的?答:無信號(hào)狀態(tài)2在每次運(yùn)行之后,數(shù)值m_hMutexValue應(yīng)該返
37、回初始值(0),原因是什么?答:先前的設(shè)置3nStep的值是怎樣變化的?答:從1和-1兩個(gè)值之間交替變化4刪除sleep(1000)可以嗎?在這里起的什么作用?答:可以,在這里設(shè)置進(jìn)程的掛起時(shí)間限制5寫出程序運(yùn)行的流程。六、 實(shí)驗(yàn)總結(jié)(包括實(shí)驗(yàn)中遇到的問題及解決方法,還存在的問題,通過本次實(shí)驗(yàn)學(xué)到些什么等)1)了解互斥對(duì)象及在進(jìn)程中怎樣使用互斥對(duì)象2)通過實(shí)驗(yàn)例子,加深對(duì)互斥對(duì)象及其應(yīng)用的理解實(shí)驗(yàn)四、文件對(duì)象一、 實(shí)驗(yàn)題目文件對(duì)象二、 實(shí)驗(yàn)?zāi)康脑诒緦?shí)驗(yàn)中,通過對(duì)文件對(duì)象的了解,來加深對(duì)Windows2000線程同步的理解。1回顧系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows2000線程間通信的
38、理解。2了解文件對(duì)象。3通過分析實(shí)驗(yàn)程序,了解線程如何通過文件對(duì)象發(fā)送數(shù)據(jù)。4了解在進(jìn)程中如何使用文件對(duì)象。三、 實(shí)驗(yàn)內(nèi)容1調(diào)試實(shí)驗(yàn)(四)中的程序2觀察并分析程序四、 實(shí)驗(yàn)過程及結(jié)果步驟1:登錄進(jìn)入Windows 2000 Professional。步驟2:在“開始”菜單中單擊“程序”-“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”命令,進(jìn)入Visual C+窗口。步驟3:在工具欄單擊“打開”按鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序4-3.cpp步驟4:單擊“Build”菜單中的“Compile 4-3.cpp”命令,并單擊“是
39、”按鈕確認(rèn)。系統(tǒng)對(duì)4-3.cpp進(jìn)行編譯。步驟5:編譯完成后,單擊“Build”菜單中的“Build 4-3.exe”命令,建立4-3.exe可執(zhí)行文件。步驟6:在工具欄單擊“Execute Program” (執(zhí)行程序) 按鈕,執(zhí)行4-3.exe程序。實(shí)驗(yàn)源代碼/ fileobj項(xiàng)目# include <windows.h># include <iostream># include <string>/ 要使用的文件名static LPCTSTR g_szFileName = "w2kdg.Fileobj.file.data.txt" ;
40、/ 在數(shù)據(jù)文件中讀取當(dāng)前數(shù)據(jù)的簡單線程時(shí)將傳遞來的該數(shù)據(jù)增加,并寫回?cái)?shù)據(jù)文件中static DWORD WINAPI ThreadProc (LPVOID lpParam)/ 將參數(shù)翻譯為長整數(shù)LONG nAdd = reinterpret_cast <LONG> (lpParam) ;/ 建立完全的指定文件名TCHAR szFullName MAX_PATH ;: GetTempPath(MAX_PATH, szFullName) ;: strcat(szFullName, g_szFileName) ;/ 打開文件對(duì)象HANDLE hFile = : CreateFile(sz
41、FullName,/ 文件的完全名稱GENERIC_READ | GENERIC_WRITE,/ 具有所有的訪問權(quán)FILE_SHARE_READ,/ 允許其他線程讀取NULL,/ 缺省的安全性O(shè)PEN_ALWAYS,/ 創(chuàng)建或打開文件FILE_ATTRIBUTE_NORMAL,/ 普通文件NULL) ;/ 無模板文件if (hFile != INVALID_HANDLE_VALUE)/ 讀取當(dāng)前數(shù)據(jù)LONG nValue(0);DWORD dwXfer(0) ;: ReadFile(hFile,/ 要讀取的文件reinterpret_cast <LPVOID> (&nVal
42、ue) ,/ 緩沖區(qū)sizeof(nValue) ,/ 緩沖區(qū)容量&dwXfer,/ 讀取的字節(jié)數(shù)NULL) ;/ 無重疊I/Oif (dwXfer = sizeof(nValue) )/ 顯示當(dāng)前數(shù)據(jù)std : cout << "read: " << nValue << std : endl;/ 增加數(shù)值nValue += nAdd;/ 寫回永久存儲(chǔ)介質(zhì)SetFilePointer(hFile, 0, NULL, FILE_CURRENT) ;: WriteFile(hFile,/ 要寫入的文件reinterpret_cast
43、<LPCVOID> (&nValue) ,/ 數(shù)據(jù)sizeof(nValue),/ 緩沖區(qū)容量&dwXfer,/ 寫入的字節(jié)數(shù)NULL) ;/ 無重疊I/Oif (dwXfer = sizeof(nValue) )std : cout << "write: " << nValue << std : endl;/ 清除文件: CloseHandle(&hFile) ;hFile = INVALID_HANDLE_VALUE;return(0) ;void main() / 創(chuàng)建100個(gè)線程從文件中進(jìn)行讀寫
44、 for (int nTotal = 100; nTotal > 0; -nTotal) / 啟動(dòng)線程 HANDLE hThread = : CreateThread( NULL,/ 缺省的安全性 0, / 缺省的堆棧 ThreadProc,/ 線程函數(shù) reinterpret_cast <LPVOID> (1) ,/ 增量 0,/ 無特殊的創(chuàng)建標(biāo)志 NULL) ;/ 忽略線程id / 等待線程完成 : WaitForSingleObject(hThread, INFINITE) ; / 釋放指向線程的句柄 : CloseHandle(hThread) ; hThread =
45、 INVALID_HANDLE_VALUE; 五、 回答問題1該程序中啟動(dòng)了多少個(gè)單獨(dú)的讀寫線程?答:100個(gè)2該程序中使用了那個(gè)系統(tǒng)API函數(shù)來創(chuàng)建線程例程?答:CreateThread()3文件的讀和寫操作分別使用了那個(gè)API函數(shù)?答:讀取文件: BOOL ReadFile( HANDLE hFile, /文件的句柄 LPVOID lpBuffer, /用于保存讀入數(shù)據(jù)的一個(gè)緩沖區(qū) DWORD nNumberOfBytesToRead, /要讀入的字符數(shù) LPDWORD lpNumberOfBytesRead, /指向?qū)嶋H讀取字節(jié)數(shù)的指針 LPOVERLAPPED lpOverlapped
46、 /如文件打開時(shí)指定了FILE_FLAG_OVERLAPPED,那么必須,用這個(gè)參數(shù)引用一個(gè)特殊的結(jié)構(gòu)。該結(jié)構(gòu)定義了一次異步讀取操作。否則,應(yīng)將這個(gè)參數(shù)設(shè)為NULL );寫入文件: BOOL WriteFile( HANDLE hFile, / 文件句柄 LPCVOID lpBuffer, / 數(shù)據(jù)緩存區(qū)指針 DWORD nNumberOfBytesToWrite, / 你要寫的字節(jié)數(shù) LPDWORD lpNumberOfBytesWritten, / 用于保存實(shí)際寫入字節(jié)數(shù)的存儲(chǔ)區(qū)域的指針 LPOVERLAPPED lpOverlapped / OVERLAPPED結(jié)構(gòu)體指針 );4getT
47、empPath()的作用?答:獲取指定文件的地址5程序中重置文件指針使用了哪一個(gè)函數(shù)?答:SetFilePointer()6寫出程序運(yùn)行的流程六、 實(shí)驗(yàn)總結(jié)(包括實(shí)驗(yàn)中遇到的問題及解決方法,還存在的問題,通過本次實(shí)驗(yàn)學(xué)到些什么等)1)了解文件對(duì)象。2)通過分析實(shí)驗(yàn)程序,了解線程如何通過文件對(duì)象發(fā)送數(shù)據(jù)。3)了解在進(jìn)程中如何使用文件對(duì)象。4)了解線程讀寫流程實(shí)驗(yàn)五、線程互斥與同步實(shí)例的應(yīng)用一、 實(shí)驗(yàn)題目 線程互斥與同步實(shí)例的應(yīng)用二、 實(shí)驗(yàn)?zāi)康睦眯盘?hào)量實(shí)現(xiàn)線程互斥與同步,用Windows提供的API函數(shù),用VISUALC+ 6.0編寫程序,解決生產(chǎn)者與消費(fèi)者問題,實(shí)現(xiàn)線程的互斥與同步三、 實(shí)驗(yàn)內(nèi)
48、容1調(diào)試實(shí)驗(yàn)(五)中的程序。2觀察并分析程序四、 實(shí)驗(yàn)過程及結(jié)果步驟1:登錄進(jìn)入Windows 2000 Professional。步驟2:在“開始”菜單中單擊“程序”-“Microsoft Visual Studio 6.0”“Microsoft Visual C+ 6.0”命令,進(jìn)入Visual C+窗口。步驟3:在工具欄單擊“打開”按鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序pc.cpp步驟4:單擊“Build”菜單中的“Compile pc.cpp”命令,并單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)pc.cpp進(jìn)行編譯。步驟5:編譯完成后,單擊“Build”菜單中的“Build pc.exe”命令,建
49、立pc.exe可執(zhí)行文件。步驟6:在工具欄單擊“Execute Program” (執(zhí)行程序) 按鈕,執(zhí)行pc.exe程序。實(shí)驗(yàn)源代碼#include <windows.h> #include <iostream>using namespace std;HANDLE h_Mutex; /用于線程間的互斥 HANDLE bufferFullSemaphore; /當(dāng)緩沖區(qū)滿時(shí)生產(chǎn)者等待信號(hào)量 HANDLE bufferEmptySemaphore; /當(dāng)緩沖區(qū)空時(shí)消費(fèi)者等待信號(hào)量 const int BUFFER_SIZE = 2; /緩沖區(qū)長度long bufferBU
50、FFER_SIZE = 0; /緩沖區(qū)循環(huán)隊(duì)列int in = 0; /用與追蹤產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)數(shù)組下標(biāo)int out = 0; /用與追蹤產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)數(shù)組下標(biāo)long rn=1; /用來模擬生產(chǎn)的產(chǎn)品DWORD producerID; /生產(chǎn)者線程的標(biāo)識(shí)符 DWORD consumerID; /消費(fèi)者線程的標(biāo)識(shí)符bool control = true; /控制生產(chǎn)者消費(fèi)者線程的循環(huán) void producer(void) /生產(chǎn)者線程 while(control)rn+; /用來模擬生產(chǎn)的產(chǎn)品,每次循環(huán)加一,以便觀察到每次產(chǎn)品的不同WaitForSingleObject(bufferFullSemaphore,/信號(hào)量指針或互斥量指針I(yè)NFINITE); /等待的最長時(shí)間,infinite表示一直等待 WaitForSingleObject(h_Mutex,INFINITE); cout &l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村地基出讓合同范例
- 企業(yè)投資股權(quán)合同范例
- 臨時(shí)雇傭維修合同范例
- 儀器設(shè)備合同范例
- 書面買賣合同范例
- 業(yè)主自理物業(yè)合同范本
- 農(nóng)村買樓合同范例
- 修腳店股合同范例
- 公寓整套轉(zhuǎn)讓合同范例
- 供訂貨合同范例
- 2025年合肥幼兒師范高等??茖W(xué)校單招職業(yè)適應(yīng)性測試題庫新版
- 2025年浙江寧波交投公路營運(yùn)管理限公司招聘12人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 勞務(wù)派遣勞務(wù)外包項(xiàng)目方案投標(biāo)文件(技術(shù)方案)
- 第四單元 第三課 拍攝學(xué)校創(chuàng)意短視頻教學(xué)設(shè)計(jì) 2024-2025學(xué)年西交大版(2024)初中信息技術(shù)七年級(jí)上冊(cè)
- 2025年蘇州工業(yè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2024年尖葉菠菜種子項(xiàng)目可行性研究報(bào)告
- DB3306T 074-2025 餐用具消毒房管理規(guī)范
- 2025年重慶市初中學(xué)業(yè)水平暨高中招生考試數(shù)學(xué)試題預(yù)測卷(二)
- “記憶中的人、事兒”為副標(biāo)題(四川眉山原題+解題+范文+副標(biāo)題作文“追求”主題)-2025年中考語文一輪復(fù)習(xí)之寫作
- 2024年吉安職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫附答案
- 消化系統(tǒng)疾病患者的睡眠質(zhì)量改善及失眠應(yīng)對(duì)措施
評(píng)論
0/150
提交評(píng)論