资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
目 录一、课程设计任务书.2二、设计题目与要求4三、总体设计思想及系统平台、语言、工具4四、数据结构与模块说明5五、用户名、源程序名、目标程序名和源程序6六、运行结果与运行情况.7七、调试记录 9八、自我评析和总结14九、参考文献14十、评分表15武汉理工大学操作系统课程设计1题目: 用多线程同步方法解决哲学家就餐问题(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) 自我评析和总结武汉理工大学操作系统课程设计2用多线程同步方法解决哲学家就餐问题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 个互斥信号量,以保证每只筷子每次只能被取得一次。武汉理工大学操作系统课程设计32.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 定义为 5武汉理工大学操作系统课程设计4sem_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;武汉理工大学操作系统课程设计5int 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);武汉理工大学操作系统课程设计6void *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);武汉理工大学操作系统课程设计75运行结果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检查发
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号