计算机与信息学院。
1、题目:多进程/线程编程:哲学家问题。
设置进程/线程,描述哲学家 ;
随机启动哲学家,显示进程/线程执行状态;
随着线程的执行,更新显示;
编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁;
编写正确的哲学家程序,保证不出现死锁;
题目描述:哲学家问题:由dijkstra提出并解决,是典型的同步问题。
问题描述有多个(设为number)哲学家共用一张圆桌,分别坐在周围number个椅子上,在圆桌上有number个碗和number个筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。
2、开发环境:
开发工具:visual c++ 6.0 ;
开发环境:windows下多进程/线程编程。
开发语言:c++
3、总体算法:
设哲学家人数为number(程序中赋值为5),采用哲学家问题的一种解法:
1)采用p、v操作,哲学家拿起筷子后就持有该资源,等到吃完放下筷子后其他哲学家才能拿起该筷子;同样,哲学家需要的某筷子被其他哲学家持有时,等待,进程因而阻塞。
2)第一个到第number-1个哲学家采用一种进程描述,先左手拿筷子,之后右手才能拿。
3)只有最后一个哲学家定义另一进程:必须拿右手边筷子,之后再拿左手边的筷子。
4)所采用方法其实质是编号资源的方法,把筷子看为临界资源,按其序号编号,哲学家只能由小到大申请资源即为本算法。
5)出现死锁的方法:最后一个哲学家也是先拿左手边的筷子,再拿右手边的筷子时就容易出现死锁。
4、详细设计。
1.若干常量、变量的定义:
const int number=5;//哲学家人数。
const int sleep_time=10;//显示时间。
const int eating_time=50;//吃饭显示的时间。
critical_section chopstics[number];/临界资源:筷子。
critical_section cs;//控制打印的临界区变量,由于一段时间只能允许一个进程打印到屏幕,所以屏幕也为临界资源。
2.状态显示函数:
定义了若干函数显示当前状态:
thingking(int i) (哲学家i正在思考),hungry(int i) (饥饿),pickup(int i,int j) (哲学家i拿起了筷子j),eating(int i) (正在吃饭),putdown(int i,int j) (哲学家i放下筷子j)。
另外定义了函数xianshi(int i),每个状态显示函数都调用该函数,显示当前调用的进程。
3.线程定义体:
1)参数为void * i,i即为调用的进程号,由于void *表示为任意类型的指针,所以要强制类型转换:int num=(int)i;
2)pv操作的实现方法:entercriticalsection(),le**ecriticalsection(),entercriticalsection(&chopstics[num]);拿起左手边的筷子。
pickup(num,num);
entercriticalsection(&chopstics[(num+1)%5]);拿起右手边的筷子。
pickup(num,num+1);
eating(num);/吃饭。
le**ecriticalsection(&chopstics[num]);放下左边的筷子。
putdown(num,num);
le**ecriticalsection(&chopstics[(num+1)%5]);放下右边的筷子。
putdown(num,num+1);
3)线程主体为死循环,没有资源时阻塞。
4.主进程main():
1)main函数**如下:
handle hthread[number];
initializecriticalsection(&cs);
/循环建立线程0-3
for (int i=0;i{
initializecriticalsection(&chopstics[i]);
hthread[i]=(handle)_beginthreadex(null,0,threadfunc1,(void*)i,0,null);
/建立线程4
initializecriticalsection(&chopstics[number-1]);
/让其不出现死锁的定义,最后一个哲学家先拿右边筷子,再拿左边筷子。
/hthread[number-1]=(handle)_beginthreadex(null,0,threadfunc2,(void*)(number-1),0,null);
/出现死锁的定义,最后一个哲学家和其他哲学家一样,也是先拿左边筷子,再拿右边筷子。
hthread[number-1]=(handle)_beginthreadex(null,0,threadfunc1,(void*)(number-1),0,null);
/等待所有hthread有效。
/等待所有线程执行完。
waitformultipleobjects(number,hthread,true,infinite);
for (i=0;i{
le**ecriticalsection(&chopstics[i]);
closehandle(hthread[i]);
le**ecriticalsection(&cs);
相关说明:1)初始所有临界区都要初始化,用 initializecriticalsection()函数。
2)线程的定义用_beginthreadex()函数。
beginthreadex()函数的原型为unsigned long_beginthreadex(void *security,unsigned stack_size,unsigne (_stdcall*start_address)(void*),void *arglist, /传给线程函数的参数的指针*/unsigned initflag,unsigned *thrdaddr );用到该函数必须链接多线程库文件,步骤为:project setting ->c/c++ code generator->use run-time library->mulitthreaded dll
3)主进程最后用waitformultipleobjects(number,hthread,true,infinite);等待所有线程都执行完,否则阻塞。
由于线程定义都是死循环,不可能执行完,所以这之后的语句执行不到。此句的作用:
一,当不出现死锁时可以一直执行线程,二,是当出现死锁时,由于各线程阻塞也没法执行完,主进程因此也阻塞,最后出现死锁。
五、执行结果。
一、不出现死锁:
二、 出现死锁!!!
六、总结。以前没有接触过多线程编程的内容,这一次为做本课程设计完全自学了好多内容。从网上搜了好多资料,一有不会的就。
做的过程中也走了些弯路。比如开始时搞忘了数组是从0开始的,实际应是从0-(number-1),好多函数的参数搞错了;还有当初不知道怎样实现pv操作;还有开始并没有完全弄清,不清楚main函数是主进程,也是会调用的,因此开始写的程序结果也不对,然后问别人才弄清楚的;程序写完后想润色一下,想把waitformultipleobjects()做为if语句的条件判断,若出现死锁则显示:出现死。
锁!,运行却并不行,想了会才知道已经出现了死锁程序就阻塞了怎么可能还会继续运行,还是因为当初没弄清。
做完后很有成就感和充实感,因为学会了很多东西,从以前对多线程一无所知,到开始入门有所了解,而且还加深了对操作系统课本相关知识的理解。总之,做完后“感觉很好”!现在已经注意到实践的重要,以后会多动手编程,锻炼编程能力的同时还会加深对知识的理解,同时还能培养兴趣。
七、**。#include <>
#include <>
#include <>
const int number=5;//哲学家人数。
const int sleep_time=10;//显示时间。
const int eating_time=50;//吃饭显示的时间。
critical_section chopstics[number];/临界资源:筷子。
critical_section cs;//控制打印的临界区变量。
/状态显示函数。
/显示被调用线程。
void xianshi(int i){
entercriticalsection(&cs);
cout<<"线程"< le**ecriticalsection(&cs);
return;
/正在思考。
void thinking(int i){
entercriticalsection(&cs);
xianshi(i);
cout<<"哲学家"< sleep(sleep_time);
le**ecriticalsection(&cs);
return;
/正饥饿。void hungry(int i){
entercriticalsection(&cs);
操作系统课程设计
课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...
操作系统课程设计
银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...
操作系统课程设计
学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....