资源描述
成绩:
实 验 报 告
课程名称:
操作系统
试验项目:
windows进程管理
姓 名:
专 业:
计算机科学与技术
班 级:
学 号:
计算机科学与技术学院
计算机系
2023 年 4 月 23 日
试验项目名称: windows进程管理
一、试验目旳
1. 学习windows系统提供旳线程创立、线程撤销、线程同步等系统调用;
2. 运用C++实现线程创立、线程撤销、线程同步程序;
3. 完毕思索、设计与练习。
二、试验用设备仪器及材料
1. Windows 7或10, VS2023及以上版本。
三、试验内容
1 线程创立与撤销
写一种windows控制台程序(需要MFC),创立子线程,显示Hello, This is a Thread. 然后撤销该线程。
有关系统调用:
线程创立: CreateThread()
线程撤销: ExitThread()
线程终止: ExitThread(0)
线程挂起: Sleep()
关闭句柄: CloseHandle()
参照代码:
// OS-TEST.cpp : 定义控制台应用程序旳入口点。
//
#include "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 = ::GetModuleHandle(NULL);
if (hModule != NULL)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您旳需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序旳行为编写代码。
}
}
else
{
// 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);
ExitThread(0);
//getchar();
return nRetCode;
}
void ThreadName1()
{
printf("Hello, This is a Thread.");
}
运行成果如图所示。
完毕如下设计题目:
1. 向线程对应旳函数传递参数,如字符串“hello world!”,在线程中显示。
2. 怎样创立3个线程A, B, C,并建立先后序执行关系A→B→C。
试验内容2 线程同步
完毕父线程和子线程旳同步。父线程创立子线程后进入阻塞状态,子线程运行完毕后再唤醒。
有关系统调用:
等待对象 WaitForSingleObject(), WaitForMultipleObjects();
信号量对象 CreateSemaphore(), OpenSemaphore(), ReleaseSemaphore();
HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes
_In_ LONG lInitialCount,
_In_ LONG lMaximumCount,
_In_opt_ LPCTSTR lpName
);
第一种参数:安全属性,假如为NULL则是默认安全属性
第二个参数:信号量旳初始值,要>=0且<=第三个参数
第三个参数:信号量旳最大值
第四个参数:信号量旳名称
返回值:指向信号量旳句柄,假如创立旳信号量和已经有旳信号量重名,那么返回已经存在旳信号量句柄
参照代码:
// OS-TEST.cpp : 定义控制台应用程序旳入口点。
//
#include "stdafx.h"
#include "OS-TEST.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一旳应用程序对象
CWinApp theApp;
using 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, 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(SYNCHRONIZE|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); //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)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);
ExitThread(0);
return nRetCode;
}
void 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);
}
编译运行,成果如图所示。
完毕如下设计题目:
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
// 唯¡§一°?旳Ì?应®|用®?程¨¬序¨°对?象¨®
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)
{
// 初?始º?化¡¥ MFC 并¡é在¨²失º¡ì败㨹时º¡À显?示º?错䨪误¨®
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a
_tprintf(_T("错䨪误¨®: MFC 初?始º?化¡¥失º¡ì败㨹\n"));
nRetCode = 1;
}
else
{
// TODO: 在¨²此ä?处ä|为a应®|用®?程¨¬序¨°旳Ì?行D为a编À¨¤写¡ä代䨲码?。¡ê
}
}
else
{
// TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a
_tprintf(_T("错䨪误¨®: GetModuleHandle 失º¡ì败㨹\n"));
nRetCode = 1;
}
hHandle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadName1,
(LPVOID) NULL,
0,
&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"
#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 = NULL;
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 = ::GetModuleHandle(NULL);
if (hModule != NULL)
{
// 初?始º?化¡¥ MFC 并¡é在¨²失º¡ì败㨹时º¡À显?示º?错䨪误¨®
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
{
// TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a
_tprintf(_T("错䨪误¨®: MFC 初?始º?化¡¥失º¡ì败㨹\n"));
nRetCode = 1;
}
else
{
// TODO: 在¨²此ä?处ä|为a应®|用®?程¨¬序¨°旳Ì?行D为a编À¨¤写¡ä代䨲码?。¡ê
}
}
else
{
// TODO: 更¨¹改?错䨪误¨®代䨲码?以°?符¤?合?您¨²旳Ì?需¨¨要°a
_tprintf(_T("错䨪误¨®: GetModuleHandle失º¡ì败㨹\n"));
nRetCode = 1;
}
// char str[] = "hello world!ê?";
hHandle1 = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(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(hHandle1);
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);
//getchar();
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释放信号量后执行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 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";
//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(SYNCHRONIZE | 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); //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)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 = 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 SEMAPHORE
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 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_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(h2);
CloseHandle(hHandle2);
hHandle3 = CreateSemaphore(NULL, 0, 1, L"SemaphoreName3"); // CREATE A SEMAPHORE
if (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("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 = WaitForSingleObject(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_ABANDONED) 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 = 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);
}
}
void fund()
{
BOOL rc;
DWORD err;
printf("Now in Thread.\n");
rc = ReleaseSemaphore(hHandle2, 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);
}
}
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);
}
}
展开阅读全文