- 6 -
上海电力大学
计算机操作系统原理
实验报告
主题:线程同步
教员:计算机科学与技术学院
专业等级:2010年信息安全等级
学生姓名:李欣学号:
相同的组名:无
2012年11月13日
上海电力大学
实验报告
计算机操作系统原理实验项目的课程名称线程同步
姓名:李新学好班专业信息安全
同一组的名称不包括讲师的姓名。徐曼实验的日期是2012年11月13日。
实验的目的和要求:
1、进一步掌握视窗系统环境下线程的创建和撤销。
2.熟悉Windows系统提供的线程排除API。
3.使用Windows系统提供的线程排除API解决实际问题。
实验的原则和内容
两个子线程之间完全互斥。在主线程中,使用系统调用CreateThread()创建两个子线程,并使这两个子线程使用互斥的全局变量计数。
实验平台和要求
可以正确使用临界区对象,包括初始化临界区初始化(),进入临界区企业检测(),退出临界区离开临界区删除临界区(),删除临界区(),进一步了解线程的互斥。
操作系统:视窗2000或视窗XP
实验平台:Visual Studio C 6.0
实验步骤和记录
1.启动已安装的Visual C 6.0。
2.选择文件-新建以创建新的Win32控制台应用程序控制台程序。
3.由于创建线程()等函数是微软操作系统的系统调用,请选择一个支持MFC的应用程序,然后单击“完成”。
4.打开编辑环境后,编辑程序并编译、链接和运行程序。
5、
6、
实验分析与结论
这个实验完成了两个子线程的互斥。在主程序中,InitializeCriticalSection()首先用于初始化临界区,然后建立两个子线程。在两个子线程中使用全局变量计数之前和之后,使用输入临界区()进入临界区,使用离开临界区()退出临界区。在两个线程的互斥执行完成后,主线程使用DeleteCriticalSection()删除关键区域并取消线程。
主要源代码:
静态int计数=5;
静态HANDLE h1。
static HANDLE h2
LPCRITICAL _ SECTION hccritical Section;
临界截面临界;
void func 1();
void func 2();
DWORD dwThreadID1,dwThreadID2
临界截面=临界;
InitializeCriticalSection(hccriticalsection);
h1=创建线程(空,
0,
函数1,
空,
0,
dwthreadId 1);
if(h1==空)
{
printf('线程1创建失败!\ n ');
}
其他
printf('线程1创建成功!\ n ');
h2=创建线程(空,
0,
函数2,
空,
0,
dwthreadid 2);
如果(h2==空)
{
printf('线程2创建失败!\ n ');
}
其他
printf('线程2创建成功!\ n ');
睡眠(1000);
关闭手柄(h1);
关闭手柄(H2);
DeleteCriticalSection(hccriticalsection);
exit thread(0);
void func1()
{
int r1
输入关键集合(hccritical集合);
r1=计数;
_睡眠(500);
R1=R1 1;
count=r1
printf(“func 1中的计数=%d\n”,计数);
离开关键部分(hccriticalsection);
}
void func2()
{
int r2
输入关键集合(hccritical集合);
r2=计数;
_睡眠(500);
R2=R2 1;
计数=r2
printf(“func 2中的计数=%d\n”,计数);
离开关键部分(hccriticalsection);
}
实验的前景(该项目已被纳入电子版)
使用Mutex完成并在计数=33时退出,源代码:
静态int计数=5;
静态HANDLE h1。
static HANDLE h2
HANDLE hMutex。
void func 1();
void func 2();
int _tmain(int argc,TCHAR* argv[],TCHAR* envp[])
{
int NRetcode=0;
DWORD dwThreadID1,dwThreadID2
hMutex=创建互斥体(空,假,“互斥体名称1”);
//标签:
h1=创建线程(空,
0,
函数1,
空,
0,
dwthreadId 1);
if(h1==空)
{
printf('线程1创建失败!\ n ');
}
其他
printf('线程1创建成功!\ n ');
h2=创建线程(空,
0,
函数2,
空,
0,
dwthreadid 2);
如果(h2==空)
{
printf('线程2创建失败!\ n ');
}
其他
printf('线程2创建成功!\ n ');
睡眠(1000);
//转到标签;
关闭手柄(h1);
关闭手柄(H2);
释放互斥体(hMutex);
退出线程(0);
返回nRetCode
}
void func1()
{
int r1
HANDLE hOpenMutex
同时(计数33)
{
WaitForSingleObject(hMutex,INFINITE);
hOpenMutex=OpenMutex(SYNCHRONIZE,NULL,' Mutex name 1 ');
r1=计数;
_睡眠(500);
R1=R1 1;
计数=r1
printf("func 1中的计数=%d\n ",计数);
释放互斥体(HopeNMutex);
}
}
void func2()
{
int r2
HANDLE hOpenMutex
同时(计数33)
{
WaitForSingleObject(hMutex,INFINITE);
hOpenMutex=OpenMutex(SYNCHRONIZE,NULL,' Mutex name 1 ');
r2=计数;
_睡眠(500);
R2=R2 1;
计数=r2
printf("func 2中的计数=%d\n ",计数);
释放互斥体(HopeNMutex);
}
}
注:实验报告内容原则上包括:实验目的与要求、实验原理与内容、实验步骤与记录、实验分析与结论等。