windows进程管理实验报告.docx
- 文档编号:24396869
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:22
- 大小:88.26KB
windows进程管理实验报告.docx
《windows进程管理实验报告.docx》由会员分享,可在线阅读,更多相关《windows进程管理实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
windows进程管理实验报告
成绩:
实验报告
课程名称:
操作系统
实验项目:
windows进程管理
姓名:
专业:
计算机科学与技术
班级:
学号:
计算机科学与技术学院
计算机系
2019年4月23日
实验项目名称:
windows进程管理
一、实验目的
1.学习windows系统提供的线程创建、线程撤销、线程同步等系统调用;
2.利用C++实现线程创建、线程撤销、线程同步程序;
3.完成思考、设计与练习。
二、实验用设备仪器及材料
1.Windows7或10,VS2010及以上版本。
三、实验内容
1线程创建与撤销
写一个windows控制台程序(需要MFC),创建子线程,显示Hello,ThisisaThread.然后撤销该线程。
相关系统调用:
线程创建:
CreateThread()
线程撤销:
ExitThread()
线程终止:
ExitThread(0)
线程挂起:
Sleep()
关闭句柄:
CloseHandle()
参考代码:
//OS-TEST.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include"OS-TEST.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//唯一的应用程序对象
CWinApptheApp;
usingnamespacestd;
voidThreadName1();
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
staticHANDLEhHandle1=NULL;
DWORDdwThreadID1;
HMODULEhModule=:
:
GetModuleHandle(NULL);
if(hModule!
=NULL)
{
//初始化MFC并在失败时显示错误
if(!
AfxWinInit(hModule,NULL,:
:
GetmandLine(),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();
returnnRetCode;
}
voidThreadName1()
{
printf("Hello,ThisisaThread.");
}
运行结果如图所示。
完成以下设计题目:
1.向线程对应的函数传递参数,如字符串“helloworld!
”,在线程中显示。
2.如何创建3个线程A,B,C,并建立先后序执行关系A→B→C。
实验内容2线程同步
完成父线程和子线程的同步。
父线程创建子线程后进入阻塞状态,子线程运行完毕后再唤醒。
相关系统调用:
等待对象WaitForSingleObject(),WaitForMultipleObjects();
信号量对象CreateSemaphore(),OpenSemaphore(),ReleaseSemaphore();
HANDLEWINAPICreateSemaphore(
_In_opt_LPSECURITY_ATTRIBUTESlpSemaphoreAttributes
_In_LONGlInitialCount,
_In_LONGlMaximumCount,
_In_opt_LPCTSTRlpName
);
第一个参数:
安全属性,如果为NULL则是默认安全属性
第二个参数:
信号量的初始值,要>=0且<=第三个参数
第三个参数:
信号量的最大值
第四个参数:
信号量的名称
返回值:
指向信号量的句柄,如果创建的信号量和已有的信号量重名,那么返回已经存在的信号量句柄
参考代码:
//OS-TEST.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include"OS-TEST.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//唯一的应用程序对象
CWinApptheApp;
usingnamespacestd;
//voidThreadName1();
staticHANDLEh1;
staticHANDLEhHandle1=NULL;
voidfunc();
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
DWORDdwThreadID1;
DWORDdRes,err;
//LPCWSTRlPCWSTR="SemaphoreName1";
//hHandle1=CreateSemaphore(NULL,0,1,NULL);//CREATEASEMAPHORE
hHandle1=CreateSemaphore(NULL,0,1,L"SemaphoreName1");//CREATEASEMAPHORE
if(hHandle1==NULL)printf("SemaphorecreateERR!
\n");
elseprintf("Semaphorecreatesuccess!
\n");
hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,
NULL,
L"SemaphoreName1");//OPENSEMAPHORE
if(hHandle1==NULL)printf("SemaphoreopenERR!
\n");
elseprintf("Semaphoreopensuccess!
\n");
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func,
(LPVOID)NULL,
0,
&dwThreadID1);//CREATECHILDTHREAD
if(h1==NULL)printf("ThreadcreateERR!
\n");
elseprintf("Threadcreatesuccess!
\n");
dRes=WaitForSingleObject(hHandle1,INFINITE);//WAITFORCHILDTHREADEND
err=GetLastError();
printf("WaitforsingleobjectERR=%d\n",err);
if(dRes==WAIT_TIMEOUT)printf("TIMEOUTOFdRes=%d\n",dRes);
elseif(dRes=WAIT_OBJECT_0)printf("WAIT_OBJECTdRes=%d\n",dRes);
elseif(dRes==WAIT_ABANDONED)printf("WAIT_ABANDONEDdRes=%d\n",dRes);
elseprintf("dRes=%d\n",dRes);
CloseHandle(h1);
CloseHandle(hHandle1);
ExitThread(0);
returnnRetCode;
}
voidfunc()
{
BOOLrc;
DWORDerr;
printf("NowinThread.\n");
rc=ReleaseSemaphore(hHandle1,1,NULL);
err=GetLastError();
printf("ReleaseSemaphoreerr=%d\n",err);
if(rc==0)printf("SemaphoreReleaseFail.\n");
elseprintf("SemaphoreReleaseSuccess.rc=%d\n",rc);
}
编译运行,结果如图所示。
完成以下设计题目:
3.用信号量控制实现3个线程的同步,线程A释放信号量后执行B,B释放信号量后执行C。
四、实验结果
实验内容1
1.向线程对应的函数传递参数,如字符串“helloworld!
”,在线程中显示。
结果:
//66645.cpp:
定¡§义°?
控?
制?
台¬¡§应®|用®?
程¨¬序¨°的Ì?
入¨?
口¨²点Ì?
。
¡ê
//
#include"stdafx.h"
#include"66645.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//唯¡§一°?
的Ì?
应®|用®?
程¨¬序¨°对?
象¨®
CWinApptheApp;
usingnamespacestd;
voidThreadName1();
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
staticHANDLEhHandle1=NULL;
DWORDdwThreadID1;
HMODULEhModule=:
:
GetModuleHandle(NULL);
if(hModule!
=NULL)
{
//初?
始º?
化¡¥MFC并¡é在¨²失º¡ì败㨹时º¡À显?
示º?
错䨪误¨®
if(!
AfxWinInit(hModule,NULL,:
:
GetmandLine(),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();
returnnRetCode;
}
voidThreadName1()
{
printf("Hello,World.");
}
2.如何创建3个线程A,B,C,并建立先后序执行关系A→B→C。
//147589.cpp:
定¡§义°?
控?
制?
台¬¡§应®|用®?
程¨¬序¨°的Ì?
入¨?
口¨²点Ì?
。
¡ê
//
#include"stdafx.h"
#include"147589.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//唯¡§一°?
的Ì?
应®|用®?
程¨¬序¨°对?
象¨®
CWinApptheApp;
usingnamespacestd;
voidThreadName1();
voidThreadName2();
voidThreadName3();
staticHANDLEh1;
staticHANDLEh2;
staticHANDLEh3;
staticHANDLEhHandle1=NULL;
staticHANDLEhHandle2=NULL;
staticHANDLEhHandle3=NULL;
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
staticHANDLEhHandle1=NULL;
staticHANDLEhHandle2=NULL;
staticHANDLEhHandle3=NULL;
DWORDdwThreadID1;
HMODULEhModule=:
:
GetModuleHandle(NULL);
if(hModule!
=NULL)
{
//初?
始º?
化¡¥MFC并¡é在¨²失º¡ì败㨹时º¡À显?
示º?
错䨪误¨®
if(!
AfxWinInit(hModule,NULL,:
:
GetmandLine(),0))
{
//TODO:
更¨¹改?
错䨪误¨®代䨲码?
以°?
符¤?
合?
您¨²的Ì?
需¨¨要°a
_tprintf(_T("错䨪误¨®:
MFC初?
始º?
化¡¥失º¡ì败㨹\n"));
nRetCode=1;
}
else
{
//TODO:
在¨²此ä?
处ä|为a应®|用®?
程¨¬序¨°的Ì?
行D为a编À¨¤写¡ä代䨲码?
。
¡ê
}
}
else
{
//TODO:
更¨¹改?
错䨪误¨®代䨲码?
以°?
符¤?
合?
您¨²的Ì?
需¨¨要°a
_tprintf(_T("错䨪误¨®:
GetModuleHandle失º¡ì败㨹\n"));
nRetCode=1;
}
//charstr[]="helloworld!
ê?
";
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();
returnnRetCode;
}
voidThreadName1()
{
printf("Hello,ThisisaThreadA.\n");
//printf("%s",str);
}
voidThreadName2()
{
printf("ThisisaThreadB.\n");
}
voidThreadName3()
{
printf("ThisisaThreadC.\n");
}
实验内容2
2.用信号量控制实现3个线程的同步,线程A释放信号量后执行B,B释放信号量后执行C。
//1234569.cpp:
定¡§义°?
控?
制?
台¬¡§应®|用®?
程¨¬序¨°的Ì?
入¨?
口¨²点Ì?
。
¡ê
//
#include"stdafx.h"
#include"1234569.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//唯¡§一°?
的Ì?
应®|用®?
程¨¬序¨°对?
象¨®
CWinApptheApp;
usingnamespacestd;
staticHANDLEh1;
staticHANDLEh2;
staticHANDLEh3;
staticHANDLEhHandle1=NULL;
staticHANDLEhHandle2=NULL;
staticHANDLEhHandle3=NULL;
voidfunc();
voidfund();
voidfune();
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
DWORDdwThreadID1;
DWORDdRes,err;
//LPCWSTRlPCWSTR="SemaphoreName1";
//hHandle1=CreateSemaphore(NULL,0,1,NULL);//CREATEASEMAPHORE
hHandle1=CreateSemaphore(NULL,0,1,L"SemaphoreName1");//CREATEASEMAPHORE
if(hHandle1==NULL)printf("SemaphorecreateERR!
\n");
elseprintf("Semaphorecreatesuccess!
\n");
hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,L"SemaphoreName1");//OPENSEMAPHORE
if(hHandle1==NULL)printf("SemaphoreopenERR!
\n");
elseprintf("Semaphoreopensuccess!
\n");
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID1);//CREATECHILDTHREAD
if(h1==NULL)printf("ThreadcreateERR!
\n");
elseprintf("Threadcreatesuccess!
\n");
dRes=WaitForSingleObject(hHandle1,INFINITE);//WAITFORCHILDTHREADEND
err=GetLastError();
printf("WaitforsingleobjectERR=%d\n",err);
if(dRes==WAIT_TIMEOUT)printf("TIMEOUTOFdRes=%d\n",dRes);
elseif(dRes=WAIT_OBJECT_0)printf("WAIT_OBJECTdRes=%d\n",dRes);
elseif(dRes==WAIT_ABANDONED)printf("WAIT_ABANDONEDdRes=%d\n",dRes);
elseprintf("dRes=%d\n",dRes);
CloseHandle(h1);
CloseHandle(hHandle1);
hHandle2=CreateSemaphore(NULL,0,1,L"SemaphoreName2");//CREATEASEMAPHORE
if(hHandle2==NULL)printf("SemaphorecreateERR!
\n");
elseprintf("Semaphorecreatesuccess!
\n");
hHandle2=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,L"SemaphoreName2");//OPENSEMAPHORE
if(hHandle2==NULL)printf("SemaphoreopenERR!
\n");
elseprintf("Semaphoreopensuccess!
\n");
h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)fund,(LPVOID)NULL,0,&dwThreadID1);//CREATECHILDTHREAD
if(h2==NULL)printf("ThreadcreateERR!
\n");
elseprintf("Threadcreatesuccess!
\n");
dRes=WaitForSingleObject(hHandle2,INFINITE);//WAITFORCHILDTHREADEND
err=GetLastError();
printf("Waitforsingleobj
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows 进程 管理 实验 报告