计算机系统原理线程为什么互斥,操作系统原理实验线程的互斥

- 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);

}

}

注:实验报告内容原则上包括:实验目的与要求、实验原理与内容、实验步骤与记录、实验分析与结论等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值