附件(四)
欧阳光明(2021.03.07)
深圳大学实验报告课程名称:操作系统
实验项目名称:进程(线程)同步及死锁学院:计算机与软件学院
专业:计算机科学与技术
指导教师:
报告人:学号:班级:
实验时间:2015/10/23
实验报告提交时间:2015/11/13
教务处制
二、方法、步骤:
设计解决哲学家就餐问题的并发线程。
假定有6个哲学家,围着圆桌交替地进行思考和进餐;每次进餐时,必须同时拿到左右两边的两只筷子才能进餐;进餐后,再放下筷子思考。
这是一个典型的同时需要两个资源的例子,如果申请资源顺序不当,可能会引起死锁。
本实验设计6个哲学家共享一个相同的线程Philosopher,既完成线程同步,又预防死锁发生。
实验中采用了3种预防死锁的方法(摒弃‘环路等待’条件,摒弃‘请求和保持’条件,摒弃‘不剥夺’条件),要预防死锁,只采用其中的任何一种方法即可。
三.实验过程及内容:(其中:提供有简短说明的程序代码。
要求:程序运行正确、符合设计要求。
)
1.创建工程,注意勾选Win32 Application,点击确定
2.勾选第三个选项
3.创建菜单,有Eat、About、Exit
4.在进程(线程)同步及死锁.cpp中编写代码,此时代码有“摒弃‘环路等待’条件”、“摒弃‘请求和保持’条件”、“摒弃‘不剥夺’条件”三种代码,当检测其中一个时须将其余两个加以注释,一一检测其对死锁的影响。
运行结果:
运行前:
运行后:
5.在运行时可知,在分别“摒弃‘环路等待’条件”和“摒弃‘不剥夺’条件”的代码时不会出现死锁,而使用“摒弃‘请求和保持’条件”时会产生死锁,在理论正确前提下,此种情况说明了代码出现错误。
6.代码解释及修改⑴摒弃‘环路等待’条件
R1=ThreadID;
R2=(ThreadID+1)%6;
if (ThreadID == 0)
{
R1= (ThreadID+1) % 6;
R2= ThreadID;
}
依据摒弃‘环路等待’条件,要有至少一位哲学家与其他哲学家拿筷子顺序不同,则使第0位(ThreadID = 0)哲学家从右边开始拿筷子,其他哲学家相反。
⑵摒弃‘不剥夺’条件
Wait(Mutex);
if (ChopstickUsed[R2])
{
Signal(Mutex);
goto ReleaseChopstick;//将左筷子放弃掉
}
Signal(Mutex);
若分配给的哲学家拿不到右筷子,则将他拿到的左筷子收回。
⑶摒弃‘请求和保持’条件
原代码:
Wait(Mutex);
if((ChopstickUsed[R1])||(ChopstickUsed[R2]))
{
Signal(Mutex);
goto LoopAgain;//思考。