免费预览已结束,剩余9页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学操作系统课程设计学 号: 课 程 设 计题 目用多线程同步方法解决哲学家就餐问题(Dining-Philosophers Problem)学 院计算机科学与技术学院专 业班 级姓 名指导教师2010年6月28日目录一、课程设计任务书.2二、设计题目与要求4三、总体设计思想及系统平台、语言、工具4四、数据结构与模块说明5五、用户名、源程序名、目标程序名和源程序6六、运行结果与运行情况.7七、调试记录 9八、自我评析和总结14九、参考文献14十、评分表15课程设计任务书3学生姓名: 专业班级: 指导教师: 工作单位: 计算机科学与技术学院 题目: 用多线程同步方法解决哲学家就餐问题(Dining-Philosophers Problem)初始条件:1 操作系统:Linux2 程序设计语言:C语言3共有5个哲学家需用餐。只许4个哲学家入席且桌上有5支筷子。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1技术要求:1)为每个哲学家产生一个线程,设计正确的同步算法2)每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。3)设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4)多个哲学家须共享操作函数代码。 2 设计说明书内容要求:1)设计题目与要求2)总的设计思想及系统平台、语言、工具等。3)数据结构与模块说明(功能与流程图)4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的Linux主机IP地址和目录。)5)运行结果与运行情况(提示: (1)连续存储区可用数组实现。(2)编译命令可用:cc -lpthread -o 目标文件名源文件名(3)多线程编程方法参见附件。) 3. 调试报告:1) 调试记录2) 自我评析和总结上机时间安排:18周一 五 08:0 12:00 指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日用多线程同步方法解决哲学家就餐问题(Dining-Philosophers Problem)1设计题目与要求1.1设计题目描述:用多线程同步方法解决哲学家就餐问题(Dining-Philosophers Problem)1.2要求:1)为每个哲学家产生一个线程,设计正确的同步算法2)每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。3)设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4)多个哲学家须共享操作函数代码。2总体设计思想及系统平台、语言、工具2.1总体设计思想哲学家就餐问题,即共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。为避免哲学家互相等待对方的筷子发生死锁,本次课程设计要求只许4个哲学家入席,以保证至少有一个哲学家能够进餐。本课程设计将room 作为信号量,将其初始化为4,以保证只允许4个哲学家同时入席就餐,这样就能保证至少有一个哲学家可以就餐。针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以实现同步哲学家就餐,而申请进入餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会出现饿死和死锁的现象,针对5只筷子分别设置了5个互斥信号量,以保证每只筷子每次只能被取得一次。2.2系统平台、语言及工具(1)操作系统:Linux(2)程序设计语言:C语言(3)工具:编辑工具Vi、编译器gcc3数据结构与模块说明线程创建函数pthread_create声明如下:#include int pthread_create (pthread_t *thread,pthread_attr_t *attr,Void* (*start_routine)(void *),void *arg);等待其它线程结束函数pthread_join声明如下: #include int pthread_join (pthread_t th,void *thread_return); 信号量的数据类型为结构sem_t,它本质上是一个长整型的数。初始化信号量函数sem_init声明如下: #include sem_init (sem_t *sem, int pshared, unsigned int value);增加信号量值函数sem_post声明如下:#include Sem_post ( sem_t *sem );减少信号量值函数sem_wait声明如下#include Sem_wait ( sem_t *sem ); 主要数据结构声明:#define NUMBERS 5 /将哲学家人数NUMBERS定义为5sem_t chopsticsNUMBERS /定义5只筷子的互斥信号量chopsticssem_t room /定义避免死锁的同步信号量room线程共享函数伪代码:void *Share(int i)think();wait(room); /请求入席进餐 wait(chopsticki); /请求左手边的筷子 wait(chopstick(i+1)%5); /请求右手边的筷子eat(); signal(chopsticki); /释放左手边的筷子signal(chopstick(i+1)%5); /释放右手边的筷子 signal(room); /退出席位释放信号量chairs 4用户名、源程序名、目标程序名和源程序4.1用户名、源程序名、目标程序名用户名: 源程序名: 目标程序名:4.2源程序#include #include #include #include #define NUMBERS 5 sem_t chopsticsNUMBERS;sem_t room; sem_t mutex;int flagNUMBERS=0,0,0,0,0;int chairsNUMBERS=0,1,2,3,4;int i,j;void *Share(int threadid);int main()int error;pthread_t threadsNUMBERS;for(i=0;iNUMBERS;i+)sem_init(&chopsticsi,0,1);sem_init(&room,0,NUMBERS-1);sem_init(&mutex,0,1);for(i=0;iNUMBERS;i+)error = pthread_create(&threadsi,NULL,(void*)Share,(void *)i);if(error)printf(ERROR: thread create failed!);/exit(-1);for(i=0;iNUMBERS;i+)pthread_join(threadsi,NULL);void *Share(int threadid)int i = threadid;sem_wait(&room); flagi=1;sem_wait(&chopsticsi);printf(philosopher %d get chopstics %dn,i,i);sem_wait(&chopstics(i+1)%NUMBERS);printf(philosopher %d get chopstics %dn,i,(i+1)%NUMBERS);sem_wait(&mutex);printf(n*n); printf(Dining.n); printf(philosopher: %d ,on chairs %d and eatingn,i,chairsi); for(j=0;jNUMBERS;j+) if(j!=i)&flagj) printf(philosopher %d ,on chairs %d and hungryn,j,chairsj); sleep(3);sem_post(&mutex);sem_post(&chopsticsi);sem_post(&chopstics(i+1)%NUMBERS);printf(philosopher %d is full and put down chopstics %d and %d and leftn,i,i,(i+1)%NUMBERS);printf(*nn); flagi=0;sem_post(&room);5运行结果6调试记录(1)将写好的代码进行编译,出现如下错误提示:1.c:(.text+0x37): undefined reference to sem_init1.c:(.text+0x6a): undefined reference to sem_init1.c:(.text+0x86): undefined reference to sem_init1.c:(.text+0xc8): undefined reference to pthread_create1.c:(.text+0x108): undefined reference to pthread_join/tmp/ccq8XD3O.o: In function Share:1.c:(.text+0x13f): undefined reference to sem_wait1.c:(.text+0x160): undefined reference to sem_wait1.c:(.text+0x1b0): undefined reference to sem_wait1.c:(.text+0x1f7): undefined reference to sem_wait1.c:(.text+0x2ad): undefined reference to sem_post1.c:(.text+0x2c0): undefined reference to sem_post1.c:(.text+0x2f5): undefined reference to sem_post1.c:(.text+0x35d): undefined reference to sem_postcollect2: ld returned 1 exit status检查发现,pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中 要加-lpthread参数:gcc -lpthread -o 1 1.c(2)重新编译代码,出现如下错误提示:1.c:9: error: invalid initializer1.c:10: error: invalid initializer1.c: In function main:1.c:35: warning: incompatible implicit declaration of built-in function exit1.c: In function Share:1.c:48: error: incompatible types when assigning to type sem_t from type int1.c:71: error: expected ; before sem_post1.c:76: error: incompatible types when assigning to type sem_t from type int仔细查看代码,发是对信号灯初始不能在定义的时候直接初始化,改用sem_init()函数对room,mutex 和flag进行初始化,去掉exit()函数,找到缺少;的地方,添加;(3)重新编译、连接、运行程序,出现如下错误提示:1.c: In function Share:1.c:48: error: incompatible types when assigning to type sem_t from type int1.c:76: error: incompatible types when assigning to type sem_t from type int查看代码,发现对信号灯flag使用出错,将flagi=1改为sem_wait(&flagi);flagi=0改为sem_post(&flagi)(4)重新编译、连接、运行程序,没有错误提示,但是结果有误:philosopher 0 get chopstics 0Im philosopher 0 get chopstics 0程序程出现死锁,无法正常进行,查看代码,发现不应该把flag设置为信号(5)改正后,重新编译、连接,运行程序,得到正确结果philosopher 0 get chopstics 0philosopher 1 get chopstics 1philosopher 2 get chopstics 2philosopher 3 get chopstics 3philosopher 3 get chopstics 4*Dining.philosopher: 3 ,on chairs 3 and eatingphilosopher 0 ,on chairs 0 and hungryphilosopher 1 ,on chairs 1 and hungryphilosopher 2 ,on chairs 2 and hungryphilosopher 3 is full and put down chopstics 3 and 4 and left*philosopher 2 get chopstics 3*Dining.philosopher: 2 ,on chairs 2 and eatingphilosopher 0 ,on chairs 0 and hungryphilosopher 1 ,on chairs 1 and hungryphilosopher 4 ,on chairs 4 and hungryphilosopher 4 get chopstics 4philosopher 2 is full and put down chopstics 2 and 3 and left*philosopher 1 get chopstics 2*Dining.philosopher: 1 ,on chairs 1 and eatingphilosopher 0 ,on chairs 0 and hungryphilosopher 4 ,on chairs 4 and hungryphilosopher 1 is full and put down chopstics 1 and 2 and left*philosopher 0 get chopstics 1*Dining.philosopher: 0 ,on chairs 0 and eatingphilosopher 4 ,on chairs 4 and hungryphilosopher 0 is full and put down chopstics 0 and 1 and left*philosopher 4 get chopstics 0*Dining.philosopher: 4 ,on chairs 4 and eatingphilosopher 4 is full and put down chopstics 4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 定风翼项目可行性分析报告范文
- 建筑维护项目可行性分析报告范文(总投资4000万元)
- 暖通施工组织设计 市劳动就业服务中心消防工程施工组织设计方案
- 服务型企业客户满意度提升方案
- 高速公路管理人员安全培训课件
- 划船安全要注意的课件
- 最震撼的企业安全教育培训课件
- 2026年建筑施工历史记录管理合同
- 2026年国际贸易合同
- 家庭理财顾问金融产品销售策略分析题目及答案
- 声乐班活动方案
- 焊接动火作业施工方案
- 储能电站运维方案
- 投标书(服装)完整版
- 装饰图案设计基础课件
- GB/T 19216.11-2003在火焰条件下电缆或光缆的线路完整性试验第11部分:试验装置火焰温度不低于750°C的单独供火
- GB/T 13172-2009裂变钼99-锝99m色层发生器
- GB/T 11344-2021无损检测超声测厚
- 中公申论内部讲义精品班综合分析
- 公司总账会计绩效考核表
- 安全文明施工措施费清单五篇
评论
0/150
提交评论