1、 成绩: 实 验 报 告 课程名称: 操作系统 试验项目: windows进程管理 姓 名: 专 业: 计算机科学与技术 班 级: 学 号: 计算机科学与技术学院 计算机系 2023 年 4 月 23 日 试验项目名称: windows进程管理 一、试验目旳 1. 学习windows系统提供旳线程创立、线程撤销、线程同步等系统调用; 2. 运用C++实现线程创立、线程撤销、线程同步程序; 3. 完毕思索、设计
2、与练习。 二、试验用设备仪器及材料 1. Windows 7或10, VS2023及以上版本。 三、试验内容 1 线程创立与撤销 写一种windows控制台程序(需要MFC),创立子线程,显示Hello, This is a Thread. 然后撤销该线程。 有关系统调用: 线程创立: CreateThread() 线程撤销: ExitThread() 线程终止: ExitThread(0) 线程挂起: Sleep() 关闭句柄: CloseHandle() 参照代码: // OS-TEST.cpp : 定义控制台应用程序旳入口点。 // #include
3、 "stdafx.h" #include "OS-TEST.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一旳应用程序对象 CWinApp theApp; using namespace std; void ThreadName1(); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; static HANDLE hHandle1=NULL; DWORD dwThreadID1; HMODULE hModule
4、 = ::GetModuleHandle(NULL); if (hModule != NULL) { // 初始化 MFC 并在失败时显示错误 if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) { // TODO: 更改错误代码以符合您旳需要 _tprintf(_T("错误: MFC 初始化失败\n")); nRetCode = 1; } else { // TODO: 在此处为应用程序旳行为编写代码。 } } else { //
5、TODO: 更改错误代码以符合您旳需要 _tprintf(_T("错误: GetModuleHandle 失败\n")); nRetCode = 1; } hHandle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0, (LPTHREAD_START_ROUTINE) ThreadName1, (LPVOID) NULL, 0, &dwThreadID1); Sleep(5000); CloseHandle(hHandle1); Exit
6、Thread(0); //getchar(); return nRetCode; } void ThreadName1() { printf("Hello, This is a Thread."); } 运行成果如图所示。 完毕如下设计题目: 1. 向线程对应旳函数传递参数,如字符串“hello world!”,在线程中显示。 2. 怎样创立3个线程A, B, C,并建立先后序执行关系A→B→C。 试验内容2 线程同步 完毕父线程和子线程旳同步。父线程创立子线程后进入阻塞状态,子线程运行完毕后再唤醒。 有关系统调用: 等待对象 Wait
7、ForSingleObject(), WaitForMultipleObjects(); 信号量对象 CreateSemaphore(), OpenSemaphore(), ReleaseSemaphore(); HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName );
8、 第一种参数:安全属性,假如为NULL则是默认安全属性 第二个参数:信号量旳初始值,要>=0且<=第三个参数 第三个参数:信号量旳最大值 第四个参数:信号量旳名称 返回值:指向信号量旳句柄,假如创立旳信号量和已经有旳信号量重名,那么返回已经存在旳信号量句柄 参照代码: // OS-TEST.cpp : 定义控制台应用程序旳入口点。 // #include "stdafx.h" #include "OS-TEST.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一旳应用程序对象 CWinApp theApp; u
9、sing namespace std; //void ThreadName1(); static HANDLE h1; static HANDLE hHandle1=NULL; void func(); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; DWORD dwThreadID1; DWORD dRes,err; //LPCWSTR lPCWSTR="SemaphoreName1"; //hHandle1=CreateSemaphore(NULL,0,1, N
10、ULL); // CREATE A SEMAPHORE hHandle1=CreateSemaphore(NULL,0,1, L"SemaphoreName1"); // CREATE A SEMAPHORE if (hHandle1==NULL) printf("Semaphore create ERR!\n"); else printf("Semaphore create success!\n"); hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE, NULL, L"S
11、emaphoreName1"); //OPEN SEMAPHORE if (hHandle1==NULL) printf("Semaphore open ERR!\n"); else printf("Semaphore open success!\n"); h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)func, (LPVOID)NULL, 0, &dwThreadID1);
12、 //CREATE CHILD THREAD if (h1==NULL) printf("Thread create ERR!\n"); else printf("Thread create success!\n"); dRes=WaitForSingleObject(hHandle1,INFINITE); //WAIT FOR CHILD THREAD END err=GetLastError(); printf("Wait for single object ERR=%d\n",err); if(dRes==WAIT_TIMEOUT)prin
13、tf("TIMEOUT OF dRes=%d\n",dRes); else if (dRes=WAIT_OBJECT_0) printf("WAIT_OBJECT dRes=%d\n",dRes); else if (dRes==WAIT_ABANDONED) printf("WAIT_ABANDONED dRes=%d\n",dRes); else printf("dRes=%d\n",dRes); CloseHandle(h1); CloseHandle(hHandle1); ExitThread(0); return nRetCode; } void
14、func() { BOOL rc; DWORD err; printf("Now in Thread.\n"); rc=ReleaseSemaphore(hHandle1,1,NULL); err=GetLastError(); printf("Release Semaphore err=%d\n",err); if(rc==0) printf("Semaphore Release Fail.\n"); else printf("Semaphore Release Success. rc=%d\n",rc); } 编译运行,成果如图所示。
15、 完毕如下设计题目: 3. 用信号量控制实现3个线程旳同步,线程A释放信号量后执行B,B释放信号量后执行C。 四、试验成果 试验内容1 1. 向线程对应旳函数传递参数,如字符串“hello world!”,在线程中显示。 成果: // 66645.cpp : 定¡§义°?控?制?台¬¡§应®|用®?程¨¬序¨°旳Ì?入¨?口¨²点Ì?。¡ê // #include "stdafx.h" #include "66645.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯¡
16、§一°?旳Ì?应®|用®?程¨¬序¨°对?象¨® CWinApp theApp; using namespace std; void ThreadName1(); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; static HANDLE hHandle1=NULL; DWORD dwThreadID1; HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL) { // 初?始º?化
17、¡¥ MFC 并¡é在¨²失º¡ì败㨹时º¡À显?示º?错䨪误¨® if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) { // TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a _tprintf(_T("错䨪误¨®: MFC 初?始º?化¡¥失º¡ì败㨹\n")); nRetCode = 1; } else { // TODO: 在¨²此ä?处ä|为a应®|用®?程¨¬序¨°旳Ì?行D为a编À¨¤写¡ä代䨲码?。¡
18、ê } } else { // TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a _tprintf(_T("错䨪误¨®: GetModuleHandle 失º¡ì败㨹\n")); nRetCode = 1; } hHandle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0, (LPTHREAD_START_ROUTINE) ThreadName1, (LPVOID) NULL, 0,
19、 &dwThreadID1); Sleep(5000); CloseHandle(hHandle1); ExitThread(0); //getchar(); return nRetCode; } void ThreadName1() { printf("Hello, World."); } 2. 怎样创立3个线程A, B, C,并建立先后序执行关系A→B→C。 // 147589.cpp : 定¡§义°?控?制?台¬¡§应®|用®?程¨¬序¨°旳Ì?入¨?口¨²点Ì?。¡ê // #include "stdafx.h"
20、 #include "147589.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯¡§一°?旳Ì?应®|用®?程¨¬序¨°对?象¨® CWinApp theApp; using namespace std; void ThreadName1(); void ThreadName2(); void ThreadName3(); static HANDLE h1; static HANDLE h2; static HANDLE h3; static HANDLE hHandle1 = NU
21、LL; static HANDLE hHandle2 = NULL; static HANDLE hHandle3 = NULL; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; static HANDLE hHandle1 = NULL; static HANDLE hHandle2 = NULL; static HANDLE hHandle3 = NULL; DWORD dwThreadID1; HMODULE hModule = ::GetModule
22、Handle(NULL); if (hModule != NULL) { // 初?始º?化¡¥ MFC 并¡é在¨²失º¡ì败㨹时º¡À显?示º?错䨪误¨® if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) { // TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a _tprintf(_T("错䨪误¨®: MFC 初?始º?化¡¥失º¡ì败㨹\n")); nRetCode = 1; } else {
23、 // TODO: 在¨²此ä?处ä|为a应®|用®?程¨¬序¨°旳Ì?行D为a编À¨¤写¡ä代䨲码?。¡ê } } else { // TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a _tprintf(_T("错䨪误¨®: GetModuleHandle失º¡ì败㨹\n")); nRetCode = 1; } // char str[] = "hello world!ê?"; hHandle1 = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0
24、 (LPTHREAD_START_ROUTINE)ThreadName1, (LPVOID)NULL, //(LPVOID)str, 0, &dwThreadID1); //Sleep(5000); hHandle2 = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)ThreadName2, (LPVOID)NULL, 0, &dwThreadID1); //Sleep(5000); // CloseHandle(hHa
25、ndle1); hHandle3 = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)ThreadName3, (LPVOID)NULL, 0, &dwThreadID1); Sleep(1000); // CloseHandle(hHandle2); CloseHandle(hHandle3); CloseHandle(hHandle2); CloseHandle(hHandle1); ExitThread(0); //getc
26、har(); return nRetCode; } void ThreadName1() { printf("Hello, This is a Thread A.\n"); //printf("%s", str); } void ThreadName2() { printf("This is a Thread B.\n"); } void ThreadName3() { printf("This is a Thread C.\n"); } 试验内容2 2. 用信号量控制实现3个线程旳同步,线程A释放信号量后执行B,B释
27、放信号量后执行C。 // 1234569.cpp : 定¡§义°?控?制?台¬¡§应®|用®?程¨¬序¨°旳Ì?入¨?口¨²点Ì?。¡ê // #include "stdafx.h" #include "1234569.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 唯¡§一°?旳Ì?应®|用®?程¨¬序¨°对?象¨® CWinApp theApp; using namespace std; static HANDLE h1; static HANDLE h2; static
28、HANDLE h3; static HANDLE hHandle1 = NULL; static HANDLE hHandle2 = NULL; static HANDLE hHandle3 = NULL; void func(); void fund(); void fune(); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; DWORD dwThreadID1; DWORD dRes, err; //LPCWSTR lPCWSTR="SemaphoreName1"
29、 //hHandle1=CreateSemaphore(NULL,0,1, NULL); // CREATE A SEMAPHORE hHandle1 = CreateSemaphore(NULL, 0, 1, L"SemaphoreName1"); // CREATE A SEMAPHORE if (hHandle1 == NULL) printf("Semaphore create ERR!\n"); else printf("Semaphore create success!\n"); hHandle1 = OpenSemaphore(SYNCHRONI
30、ZE | SEMAPHORE_MODIFY_STATE,NULL,L"SemaphoreName1"); //OPEN SEMAPHORE if (hHandle1 == NULL) printf("Semaphore open ERR!\n"); else printf("Semaphore open success!\n"); h1 = CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID1)
31、 //CREATE CHILD THREAD if (h1 == NULL) printf("Thread create ERR!\n"); else printf("Thread create success!\n"); dRes = WaitForSingleObject(hHandle1, INFINITE); //WAIT FOR CHILD THREAD END err = GetLastError(); printf("Wait for single object ERR=%d\n", err); if (dRes ==
32、 WAIT_TIMEOUT)printf("TIMEOUT OF dRes=%d\n", dRes); else if (dRes = WAIT_OBJECT_0) printf("WAIT_OBJECT dRes=%d\n", dRes); else if (dRes == WAIT_ABANDONED) printf("WAIT_ABANDONED dRes=%d\n", dRes); else printf("dRes=%d\n", dRes); CloseHandle(h1); CloseHandle(hHandle1); hHandle2 =
33、CreateSemaphore(NULL, 0, 1, L"SemaphoreName2"); // CREATE A SEMAPHORE if (hHandle2 == NULL) printf("Semaphore create ERR!\n"); else printf("Semaphore create success!\n"); hHandle2 = OpenSemaphore(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, NULL, L"SemaphoreName2"); //OPEN SEMA
34、PHORE if (hHandle2 == NULL) printf("Semaphore open ERR!\n"); else printf("Semaphore open success!\n"); h2 = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)fund, (LPVOID)NULL, 0, &dwThreadID1); //CREATE CHILD THREAD if (h2 == NULL) printf("Thread create
35、ERR!\n"); else printf("Thread create success!\n"); dRes = WaitForSingleObject(hHandle2, INFINITE); //WAIT FOR CHILD THREAD END err = GetLastError(); printf("Wait for single object ERR=%d\n", err); if (dRes == WAIT_TIMEOUT)printf("TIMEOUT OF dRes=%d\n", dRes); else if (dRes = WAIT_OBJE
36、CT_0) printf("WAIT_OBJECT dRes=%d\n", dRes); else if (dRes == WAIT_ABANDONED) printf("WAIT_ABANDONED dRes=%d\n", dRes); else printf("dRes=%d\n", dRes); CloseHandle(h2); CloseHandle(hHandle2); hHandle3 = CreateSemaphore(NULL, 0, 1, L"SemaphoreName3"); // CREATE A SEMAPHORE if (
37、hHandle3 == NULL) printf("Semaphore create ERR!\n"); else printf("Semaphore create success!\n"); hHandle3 = OpenSemaphore(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, NULL, L"SemaphoreName3"); //OPEN SEMAPHORE if (hHandle3 == NULL) printf("Semaphore open ERR!\n"); else printf(
38、"Semaphore open success!\n"); h3 = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)fune, (LPVOID)NULL, 0, &dwThreadID1); //CREATE CHILD THREAD if (h3 == NULL) printf("Thread create ERR!\n"); else printf("Thread create success!\n"); dRes = WaitForSingleOb
39、ject(hHandle3, INFINITE); //WAIT FOR CHILD THREAD END err = GetLastError(); printf("Wait for single object ERR=%d\n", err); if (dRes == WAIT_TIMEOUT)printf("TIMEOUT OF dRes=%d\n", dRes); else if (dRes = WAIT_OBJECT_0) printf("WAIT_OBJECT dRes=%d\n", dRes); else if (dRes == WAIT_ABANDONE
40、D) printf("WAIT_ABANDONED dRes=%d\n", dRes); else printf("dRes=%d\n", dRes); CloseHandle(h3); CloseHandle(hHandle3); ExitThread(0); return nRetCode; } void func() { BOOL rc; DWORD err; printf("Now in Thread.\n"); rc = ReleaseSemaphore(hHandle1, 1, NULL); err = GetLastErr
41、or(); printf("Release Semaphore err=%d\n", err); if (rc == 0) printf("Semaphore Release Fail.\n"); else { printf("Semaphore Release Success. rc=%d\n", rc); } } void fund() { BOOL rc; DWORD err; printf("Now in Thread.\n"); rc = ReleaseSemaphore(hHandle2, 1, NULL); err = G
42、etLastError(); printf("Release Semaphore err=%d\n", err); if (rc == 0) printf("Semaphore Release Fail.\n"); else { printf("Semaphore Release Success. rc=%d\n", rc); } } void fune() { BOOL rc; DWORD err; printf("Now in Thread.\n"); rc = ReleaseSemaphore(hHandle3, 1, NULL); err = GetLastError(); printf("Release Semaphore err=%d\n", err); if (rc == 0) printf("Semaphore Release Fail.\n"); else { printf("Semaphore Release Success. rc=%d\n", rc); } }
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818