欢迎来到天天文库
浏览记录
ID:59141575
大小:175.50 KB
页数:8页
时间:2020-09-11
《进程同步及死锁.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、附件(四)深圳大学实验报告课程名称:操作系统实验项目名称:进程(线程)同步及死锁学院:计算机与软件学院专业:计算机科学与技术指导教师:报告人:学号:班级:实验时间:2015/10/23实验报告提交时间:2015/11/13教务处制一、实验目的与要求:实验目的:在多进程(线程)运行环境中,进程(线程)之间并发执行,如果对进程(线程)访问临界资源(如公共变量)的操作不加限制,就会产生“与时间有关”的错误。为防止这类错误,必须用同步机构控制进程(线程)对临界资源(公共变量)的访问。在一个进程(线程)需要两个或两个以上的临界资源时,如果申请和
2、推进顺序不当,会造成死锁,即多个进程(线程)因竞争临界资源而造成的一种僵局,若无力作用,这些进程(线程)都将永远不会再向前执行。本实验利用Window系统提供的同步机制,来协调线程(Thread)间的并发执行,并比较各种预防死锁的措施,以加深对同步机制和死锁的理解,并学会在并发程序中引用同步机构,并预防死锁的编程方法。实验要求:熟悉Windows操作系统及VC程序设计方法。二、方法、步骤:设计解决哲学家就餐问题的并发线程。假定有6个哲学家,围着圆桌交替地进行思考和进餐;每次进餐时,必须同时拿到左右两边的两只筷子才能进餐;进餐后,再放下
3、筷子思考。这是一个典型的同时需要两个资源的例子,如果申请资源顺序不当,可能会引起死锁。本实验设计6个哲学家共享一个相同的线程Philosopher,既完成线程同步,又预防死锁发生。实验中采用了3种预防死锁的方法(摒弃‘环路等待’条件,摒弃‘请求和保持’条件,摒弃‘不剥夺’条件),要预防死锁,只采用其中的任何一种方法即可。三.实验过程及内容:(其中:提供有简短说明的程序代码。要求:程序运行正确、符合设计要求。)1.创建工程,注意勾选Win32Application,点击确定2.勾选第三个选项3.创建菜单,有Eat、About、Exit4
4、.在进程(线程)同步及死锁.cpp中编写代码,此时代码有“摒弃‘环路等待’条件”、“摒弃‘请求和保持’条件”、“摒弃‘不剥夺’条件”三种代码,当检测其中一个时须将其余两个加以注释,一一检测其对死锁的影响。运行结果:运行前:运行后:5.在运行时可知,在分别“摒弃‘环路等待’条件”和“摒弃‘不剥夺’条件”的代码时不会出现死锁,而使用“摒弃‘请求和保持’条件”时会产生死锁,在理论正确前提下,此种情况说明了代码出现错误。6.代码解释及修改⑴摒弃‘环路等待’条件R1=ThreadID;R2=(ThreadID+1)%6;if(ThreadID=
5、=0){R1=(ThreadID+1)%6;R2=ThreadID;}依据摒弃‘环路等待’条件,要有至少一位哲学家与其他哲学家拿筷子顺序不同,则使第0位(ThreadID=0)哲学家从右边开始拿筷子,其他哲学家相反。⑵摒弃‘不剥夺’条件Wait(Mutex);if(ChopstickUsed[R2]){Signal(Mutex);gotoReleaseChopstick;//将左筷子放弃掉}Signal(Mutex);若分配给的哲学家拿不到右筷子,则将他拿到的左筷子收回。⑶摒弃‘请求和保持’条件原代码:Wait(Mutex);if((
6、ChopstickUsed[R1])
7、
8、(ChopstickUsed[R2])){Signal(Mutex);gotoLoopAgain;//思考}Wait(ChopStick[R1]);//调用WaitForSingleObject等待信号量DrawChopstick(hBrush[ThreadID],R1,TRUE);Wait(ChopStick[R2]);DrawChopstick(hBrush[ThreadID],R2,TRUE);错误分析:此代码虽然if语句能够保证在左右筷子都没被其他线程申请并保持情况下进行拿筷子操作,但没
9、有实现同时拿起筷子,而是先后拿起筷子,这可能会使得别的线程在先后过程中拿起筷子,从而造成死锁。修改代码:HANDLEhSemaphore[2];hSemaphore[0]=ChopStick[R1];hSemaphore[1]=ChopStick[R2];Wait(Mutex);if((ChopstickUsed[R1])
10、
11、(ChopstickUsed[R2])){Signal(Mutex);gotoLoopAgain;}Signal(Mutex);WaitForMultipleObjects(2,hSemaphore,FALSE,
12、INFINITE);DrawChopstick(hBrush[ThreadID],R1,TRUE);DrawChopstick(hBrush[ThreadID],R2,TRUE);此代码使得if判断语句后哲学家同时拿起筷
此文档下载收益归作者所有