操作系统实验三木拉提巴力 105号.docx
《操作系统实验三木拉提巴力 105号.docx》由会员分享,可在线阅读,更多相关《操作系统实验三木拉提巴力 105号.docx(8页珍藏版)》请在冰点文库上搜索。
操作系统实验三木拉提巴力105号
新疆师范大学
操作系统(本科)
实验报告
院系:
__计算机科学与技术学院__
班级:
__2011-1班_____________
学生姓名:
__木拉提·巴力__________
学号:
__05号__________________
指导教师:
___李娟老师_____________
完成日期2014年04月03日
实验题目:
线程的同步
一、实验目的和要求:
1.进一步掌握Windows系统环境下线程的创建和撤销。
2.熟悉Windows系统提供的线程通步API.
3.使用Windows系统提供的线程通步API解决实际问题。
实验要求:
能正确使用等待对象WaitForSingleObject()或WaitForMultipleObject()及信号量对象CreateSemaphore(),OpenSemaphore(),ReleaseSemaphore()
等系统调用,进一步理解线程的同步。
二、实验内容:
完成主,子两个线程之间的同步,要求子线程先执行。
在主线程中使用系统调用
CreateThread()创建一个子线程。
主线程创建子线程后进入阻塞状态,直到子线程运行完毕后唤醒主线程。
三、实验技术和方法:
(说明:
对本实验涉及的教材中的相关内容进行归纳总结,只需简要说明即可。
)
在MicrosoftVisualC++6.0环境下建立一个MFC支持的控制台工程文件,编写C程序,在程序中使用CreateSemaphore(NULL,0,1,”SemaphoreNamel”)创建一个名为”SemaphoreNamel”的信号量,信号量的初始值为0,之后使用,
OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,”
SemaphoreNamel”)打开该信号量,这里访问标志用
“SYNCHRONIZE|SEMAPHORE_MODIFY_STATE”以便之后可以使用
WaitForSingleObject()等待该信号量及使用ReleaseSemaphore()释放该信号量,
然后创建一个子线程,主线程创建子线程后调用WaitForSingleObject(hHandle1,INFINITE),这里等待时间设置为INFINITE表示要一直等待下去,知道该信号量被唤醒为止。
子线程结束,调用ReleaseSemaphore(hHandle1,1,NULL)释放信号量,使信号量的值加1.
四、实验环境:
(说明:
列出本实验使用到的软件平台和工具,如Linux系统版本,shell类型,vi编辑工具等。
)
本实验在WindowsXP,microsoftvisualc++6.0环境下实现。
五、实验步骤和结果:
(说明:
详细给出实验步骤和结果。
实验步骤不一定与《实验指南》中的完全一致。
对实验结果,除文字说明外,对一些关键结果,需要给出一些界面截图。
)
实验完成了主,子现成的同步,主线程创建子线程后,主线程塞,让子线程先执行,等子线程执行完后,由子线程唤醒主线程。
其主要代码如下:
//murat.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"miregul.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////
////////////////////
//Theoneandonlyapplicationobject
CWinApptheApp;
usingnamespacestd;
staticHANDLEh1;//线程句柄
staticHANDLEhHandle1=NULL;//信号量句柄
voidfunc();
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
DWORDdwThreadID1;
DWORDdRes,err;
hHandle1=CreateSemaphore(NULL,0,1,"SemaphoreName1");//创建一个信号量
if(hHandle1==NULL)printf("SemaphoreCreateFail!
\n");
elseprintf("SemaphoreCreateSuccess!
\n");
hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,
NULL,
"SemaphoreName1");//打开信号量
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=WaitForSingleObject(hHandle1,INFINITE);//主线程等待子线程结束
err=GetLastError();
printf("WaitForeSingleObjecterr=%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);
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);
}
实验的步骤及结果:
1.启动安装好的microsofitVisualC++6.0.
2.工程文件创建过程。
(3)对工程进行“设计”过程
六、结果分析:
(说明:
包括“实验结果与预期结果的差异”和“实验的不足之处及改进方法”两部分。
)
1)总的实验步骤和线程的创建和撤销的大致相同
2)在实验一线程的创建和撤销的基础上进一步掌握了线程同步的实验过程以及具体步骤。
3)对等待一个对象【WaitForMultipleObject()】和等待多个对象【WaitForMultipleObject()】、创建信号量【CreateSemaphore()】、打开信号量【OpenSemaphore()】、增加信号量【Releasesemaphore()】等的调用方法有了较好的理解。
4)了解了主线程和子线程同步过程中执行的先后顺序。
先执行子线程,然后执行主线程。
本次试验中我们通过老师的指导下掌握了有关线程的同步的调用方法及其结果,提高了知识对操作系统这门课提高了兴趣。