- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
《操作系统原理》实验报告
实验序号:3实验项目名称:线程的同步
学号
姓名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
1.进一步掌握Windows系统环境下线程的创建与撤销。
熟悉Windows系统提供的线程同步API。
使用Windows系统提供的线程同步API解决实际问题。
二、实验设备(环境)及要求
Windows操作系统与VisualC++开发环境
三、实验内容与步骤
完成主、子两个线程之间的同步,要求子线程先执行。在主线程中使用系统调用CreateThread()创建一个子线程。主线程创建子线程后进入阻塞状态,直到子线程运行完毕后唤醒主线程。
参考程序?
#includestdafx.h
#includestdio.h
#includewindows.h
staticHANDLEh1;//线程句柄
staticHANDLEhHandle1=NULL;//信号量句柄
voidfunc();
intmain(intargc,char*argv[])
{
intnRetCode=0;
DWORD dwThreadID1;
DWORDdRes,err;
hHandle1=代码1//创建一个信号量
if (hHandle1==NULL)printf(SemaphoreCreateFail!\n);
elseprintf(SemaphoreCreateSuccess!\n);
hHandle1=代码2//打开信号量
if (hHandle1==NULL)printf(SemaphoreOpenFail!\n);
elseprintf(SemaphoreOpenSuccess!\n);
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,
(LPTHREAD_START_ROUTINE)func,
(LPVOID)NULL,
0,dwThreadID1);//创建子线程
if(h1==NULL)printf(Thread1createFail!\n);
elseprintf(Thread1createSuccess!\n);
dRes=代码3//主线程等待子线程结束
err=GetLastError();
printf(WaitForSingleObjecterr=%d\n,err);
if(dRes==WAIT_TIMEOUT) printf(TIMEOUT!dRes=%d\n,dRes);
elseif (dRes==WAIT_OBJECT_0)printf(WAIT_OBJECT!dRes=%d\n,dRes);
elseif (dRes==WAIT_ABANDONED)printf(WAIT_ABANDONED!dRes=%d\n,dRes);
else printf(dRes=%d\n,dRes);
CloseHandle(h1);
CloseHandle(hHandle1);
ExitThread(0);
returnnRetCode;
}
voidfunc()
{
BOOLrc;
DWORDerr;
printf(NowInThread!\n);
rc=代码4//子线程唤醒主线程
err=GetLastError();
printf(ReleaseSemaphoreerr=%d\n,err);
if(rc==0)printf(SemaphoreReleaseFail!\n);
elseprintf(SemaphoreReleaseSuccess!rc=%d\n,rc);
}
以上程序完成了主、子两个线程执行先后顺序的同步关系,填充代码并思考以下问题:
如何实现多个线程的同步?
若允许子线程执行多次后主线程再执行,又如何设置信号量的初值。
四、实验结果与数据处理
五、分析与讨论
对上机实践结果进行分析,上机的心得体会。
六、教师评语
签名:
日期:
成绩
文档评论(0)