OS 实验四 木拉提巴力 计111班 05号.docx
《OS 实验四 木拉提巴力 计111班 05号.docx》由会员分享,可在线阅读,更多相关《OS 实验四 木拉提巴力 计111班 05号.docx(9页珍藏版)》请在冰豆网上搜索。
OS实验四木拉提巴力计111班05号
新疆师范大学
操作系统(本科)
实验报告
院系:
_计算机科学与技术_
班级:
_11-1班_____
学生姓名:
_木拉提·巴力_________
学号:
_05号_____
指导教师:
_李娟老师_________
完成日期2014年4月18日
实验题目:
线程的互斥
一、实验目的和要求:
目的:
1.熟练掌握Windows系统环境下线程的创建于撤销。
2.熟悉Windows系统提供的线程互斥API。
3.使用Windows系统提供的线程互斥API解决实际问题。
要求:
能正确使用临界区对象,包括初始化临界区InitializecritiCalSection()、进入临界区EnterCriticalSection()、退出临界区LeaveCriticalSection()及删除临界区DeleteCriticalsection(),进一步理解线程的互斥。
二、实验内容:
完成两个子线程之间的互斥,在主线程中使用系统调用CreateThread()创建两个子线程,并使两个子线程互斥的使用全局变量count。
三、实验技术和方法:
(说明:
对本实验涉及的教材中的相关内容进行归纳总结,只需简要说明即可。
)
1.创建临界区
VOIDInitializeCriticalSection(
LPCRITICAL_SECTIONlpCriticalSection
);
2.进入临界区
VOIDEnterCriticalSection(
LPCRITICAL_SECTIONlpCriticalSection
);
3.退出临界区
VOIDLeaveCriticalSection(
LPCRITICAL_SECTIONlpCriticalSection
);
4.删除临界区
VOIDDeleteCriticalSection(
LPCRITICAL_SECTIONlpCriticalSection
);
四、实验环境:
(说明:
列出本实验使用到的软件平台和工具,如Linux系统版本,shell类型,vi编辑工具等。
)
本实验在Windows7,Microsoft Visual C++ 6.0环境下实现。
五、实验步骤和结果:
(说明:
详细给出实验步骤和结果。
实验步骤不一定与《实验指南》中的完全一致。
对实验结果,除文字说明外,对一些关键结果,需要给出一些界面截图。
)
实验步骤:
新建工程→创建类控制台→写代码。
实验完成了两个子线程的互斥。
在主程序中首先使用InitializeCriticalSection()初始化临界区,然后建立了两个子线程,在两个子线程中使用全局变量count的前后分别使用了EnterCriticalSection()进入临界区及使用LeaveCriticalSection()退出临界区,两个线程互斥的执行完成后,主线程使用DeleteCriticalSection()删除临界区并撤销线程。
其主要代码如下:
//木拉提.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"木拉提.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//Theoneandonlyapplicationobject
CWinApptheApp;
usingnamespacestd;
staticintcount=5;//静态变量
staticHANDLEh1;
staticHANDLEh2;
LPCRITICAL_SECTIONhCriticalSection;//定义指向临界区对象的地址指针
CRITICAL_SECTIONCritical;//定义临界区
voidfunc1();//子函数
voidfunc2();//子函数
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])//主线程
{
intnRetCode=0;
DWORDdwThreadID1,dwThreadID2;
hCriticalSection=&Critical;//将指向临界区对象的指针指向临界区
InitializeCriticalSection(hCriticalSection);//创建临界区
//以下是创建了两个子线程
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func1,
(LPVOID)NULL,
0,&dwThreadID1);//创建线程func1
if(h1==NULL)printf("Thread1createFail!
\n");
elseprintf("Thread1createsuccess!
\n");
h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func2,
(LPVOID)NULL,
0,&dwThreadID2);//创建线程func2
if(h1==NULL)printf("Thread2createFail!
\n");
elseprintf("Thread2createsuccess!
\n");
_sleep(1000);
CloseHandle(h1);
CloseHandle(h2);
DeleteCriticalSection(hCriticalSection);//删除临界区
ExitThread(0);//撤销所有的线程
returnnRetCode;
}
voidfunc2()
{
intr2;
EnterCriticalSection(hCriticalSection);//进入临界区
r2=count;
_sleep(100);//挂起
r2=r2+1;
count=r2;
printf("countinfunc2=%d\n",count);
LeaveCriticalSection(hCriticalSection);//退出临界区
}
voidfunc1()
{
intr1;
EnterCriticalSection(hCriticalSection);//进入临界区
r1=count;
_sleep(100);//挂起
r1=r1+1;
count=r1;
printf("countinfunc1=%d\n",count);
LeaveCriticalSection(hCriticalSection);//退出临界区
}
实验步骤及结果如下:
(1)首先启动安装好的microsofitVisualC++6.0.
(2)工程文件创建过程。
结果:
六、结果分析:
(说明:
包括“实验结果与预期结果的差异”和“实验的不足之处及改进方法”两部分。
)
1.进一步巩固和掌握第一,第二次实验线程的创建与撤销和线程的同步的一些基本函数的运用方法和各自的功能的基础上了解线程的互斥。
2.对初始化临界区InitializeCriticalSection(),进入临界区EnterCriticalSection(),退出临界区LeaveCriticalSection()及删除临界区DeleteCriticalSection()等命令的使用方法以及他们各自的功能有所了解。
3.对线程互斥的源代码有所了解,比如进入临界区和退出临界区等。
实验心得:
通过这次实验学习了如何初始化临界区,进入临界区,临界资源使用,退出临界区,删除临界区,并且巩固了所学知识。
本来在实验课中老师将实验讲义的时候我不太理解实验内容,不能按时写出来了实验报告。
还有在课堂上没有保持好课堂纪律,热了老师生气。
回宿舍后我真的很惭愧,决心重新好好看实验书认真做实验,终于做出来了。
希望老师原谅我那次的错误。
今后我保重努力学习,认真听课,认真做实验,用我的最好表现得到老师的认可而努力。