1 / 18
文档名称:

操作系统课程设计-用多线程同步方法解决睡眠理发师问题(SleepingBarber Problem).docx

格式:docx   大小:231KB   页数:18页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

操作系统课程设计-用多线程同步方法解决睡眠理发师问题(SleepingBarber Problem).docx

上传人:游园会 2023/1/24 文件大小:231 KB

下载得到文件列表

操作系统课程设计-用多线程同步方法解决睡眠理发师问题(SleepingBarber Problem).docx

文档介绍

文档介绍:该【操作系统课程设计-用多线程同步方法解决睡眠理发师问题(SleepingBarber Problem) 】是由【游园会】上传分享,文档一共【18】页,该文档可以免费在线阅读,需要了解更多关于【操作系统课程设计-用多线程同步方法解决睡眠理发师问题(SleepingBarber Problem) 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。题目:用多线程同步方法解决睡眠理发师问题〔Sleeping-BarberProblem)
初始条件:
::C语言
,5把椅子〔另外还有一把理发椅〕,几把椅子可用连续存储单元。
要求完成的主要任务:〔包括课程设计工作量及其技术要求,以及说明书撰写等具体要求〕
技术要求:
为每个理发师/顾客产生一个线程,设计正确的同步算法
每个顾客进入理发室后,即时显示“Entered”及其线程自定义标识,还同时显示理发室共有几名顾客及其所坐的位置。
至少有10个顾客,每人理发至少3秒钟。
多个顾客须共享操作函数代码。
设计说明书内容要求:
设计题目与要求
总的设计思想及系统平台、语言、工具等。
数据构造与模块说明〔功能与流程图〕
给出用户名、源程序名、目标程序名和源程序及其运行结果。〔要注明存储各个程序及其运行结果的主机IP地址和名目。〕
运行结果与运行状况
〔提示: (1)连续存储区可用数组实现。
编译命令可用:cc -lpthread -o 目标文件名 源文件名
多线程编程方法参见附件。〕
设计题目与要求
设计题目
用多线程同步方法解决睡眠理发师问题〔Sleeping-BarberProblem)
设计要求
初始条件
操作系统:Linux
程序设计语言:C语言
设有一个理发师,5把椅子〔另外还有一把理发椅〕,几把椅子可用连续存储单元。
技术要求
为每个理发师/顾客产生一个线程,设计正确的同步算法
每个顾客进入理发室后,即时显示“Entered及”其线程自定义标识,还同时显示理发室共有几名顾客及其所坐的位置。
至少有10个顾客,每人理发至少3秒钟。
多个顾客须共享操作函数代码。
总体设计思想及开发环境与工具
总体设计思想
题目中要求描述理发师和顾客的行为,因此需要两类线程barber和customer分别描述理发师和顾客的行为。其中,理发师有活动有理发和睡觉两个大事;等待和理发二个大事。店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个大事时,需推断有没有空闲的椅子,理发师打算要理发或睡觉时,也要推断椅子上有没有顾客。所以,顾客和理
发师之间的关系表现为:
理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。
理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。
故引入3个信号量和一个掌握变量:
ⅰ掌握变量waiting用来记录等候理发的顾客数,初值为0;
ⅱ信号量customers用来记录等候理发的顾客数,并用作堵塞理发师进程,初值为0;ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作堵塞顾客进程,初值为1;ⅳ信号量mutex用于互斥,初值为1
多线程编程原理
此次在Linux下进展多线程编程需要用到pthread_create和pthread_join这两个函数。
创立一个线程
pthread_create用来创立一个线程,原型为:extern int pthread_create((pthread_t * thread,
*(* start_routine)(void*),void* arg))

const pthread_attr_t * attr,void
第一个参数为指向线程标识符的指针,其次个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最终一个参数是运行函数的参数。函数thread不需要参数时,最终一个参数设为空指针。其次个参数设为空指针时,将生成默认属性的线程。创立线程成功后,创立的线程则运行参数三和参数四确定的函数,原来的线程则连续运行下一行代码。
等待一个线程完毕
pthread_join用来等待一个线程的完毕,函数原型为:
externintpthread_join P((pthread_t th,void** thread_return));
第一个参数为被等待的线程标识符,其次个参数为一个用户定义的指针,它可以用来存
储被等待线程的返回值。这个函数是一个线程堵塞的函数,调用它的函数将始终等待到被等待的线程完毕为止,当函数返回时,被等待线程的资源被收回。
信号量
函数sem_init〔〕用来初始化一个信号量,函数原型为:
externintsem_init P((sem_t* sem,int pshared,unsignedint value));sem为指向信号量构造的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的全部线程共享;value给出了信号量的初始值。
函数sem_post(sem_t*sem)用来增加信号量的值。
当有线程堵塞在这个信号量上时,调用这个函数会使其中的一个线程不在堵塞,选择机制同样是由线程的调度策略打算的。
函数sem_wait(sem_t*sem)被用来堵塞当前线程直到信号量sem的值大于0,解除堵塞后将sem的值减一,说明公共资源经使用后削减。函数sem_trywait(sem_t
*sem)是函数sem_wait〔〕的非堵塞版本,它直接将信号量sem的值减一。
伪码实现
difinen5;
//为顾客预备的椅子数为5
semaphore mutex=1; //用于互斥
semaphore customers=0;//等候理发的顾客数semaphore barbers=1;//正在等候顾客的理发师数
int waiting=0;
//等候理发的顾客数
//理发师线程
{
while(true)
//推断有无顾客
voidbarber
{
wait(customers); //假设无顾客,理发师睡眠
wait(mutex); //互斥
waiting--; //等候顾客数少一个
signal(mutex); //释放临界资源
signal(barber); //理发师去为一个顾客理发cut_hair; //正在理发
}
}
//顾客线程
voidcustomer
{
wait(mutex); //互斥
if(waiting<n) //假设有空椅子,则等待
{
waiting++; //等候顾客数加1
signal(mutex); //释放临界资源signal(customers); //假设理发师睡觉,唤醒理发师
wait(barber); //理发师在理发,顾客等候
get_haircut; //顾客坐下等理发师
}
else
signal(mutex); //店里人满了,顾客离开
}
}
开发环境与工具
系统平台:LINUX环境实现语言:C语言
开发工具:NANO编辑器
数据构造与模块说明
数据构造
通过分析课程设计要求,定义以下的数据:
sem_tmutex,customers,barbers;//designthreesemaphores:mutex,customer,barbersintwaiting=0; //thenumberofwaitingcustomers
intchair[5];
程序模块说明
主函数模块
主函数流程图如下:
理发师模块
理发师模块函数流程图如下:
顾客模块
顾客模块函数流程图如下:
源程序代码
#include<>#include<>#include<>#include<>#include<>#include<>#include<>
#definen5 //theshophavefivechairs
//designthreesemaphores:mutex,customer,barberssem_tmutex,customers,barbers;
intwaiting=0; //thenumberofwaitingcustomersintchair[5];
void*barber;
void*customer(void*arg);
intmain(intargc,char*argv[])
{
//create10semaphoresandoneBarbersemaphorepthread_tCustomer_id[10],Barber_id;
inti;
sem_init(&mutex,0,1); //initmutexsemaphoreto1sem_init(&customers,0,0);//initsemaphorecustomersto0sem_init(&barbers,0,1);
for(i=0;i<5;i++)pthread_create(&Barber_id,NULL,(void*)barber,NULL);for(i=0;i<10;i++)
pthread_create(&Customer_id[i],NULL,(void*)customer,(void*)(i+1));for(i=0;i<10;i++)
pthread_join(Customer_id[i],NULL);for(i=0;i<5;i++)pthread_join(Barber_id,NULL);return0;
}
//creatbarberpthread

最近更新

幼教转行策划方案范文模板相关7篇 14页

辽宁省锦州市2023年中考英语试题(附真题解析.. 20页

2023人教版带答案高中地理必修一第五章植被与.. 30页

2023年年自来水公司稽查队年终总结 25页

2023年违法用地和违法建设整治工作方案 4页

25道吉利控股行政助理岗位常见面试问题含HR常.. 25页

【统编教材】2019秋季学期部编版小学语文四年.. 6页

中考计算机练习题 15页

人教版九年级上册数学期末试题(含答案) 6页

信息技术应用课程形成性考核册参考答案 7页

关于研究生中期考核个人总结【三篇】 5页

包装、运输方案及对加工成品的保护和路程时间.. 6页

大学英语 期末考试复习100题 18页

完整版)园区智慧安防解决方案2020 43页

年终发言稿(精选6篇) 8页

建设互联网+政务服务平台,提升政务服务效能 7页

技术部工作总结及计划 技术部年终总结与工作计.. 4页

教师口语智慧树知到课后章节答案2023年下安阳.. 12页

毕业生就业情况报告(合集6篇) 10页

河北新高考志愿填报规则 5页

注塑车间工艺工程师岗位职责3篇(注塑工艺员工.. 20页

激光加工创新训练 湖南大学中国大学mooc课后章.. 12页

高中生物选修三基因工程知识点 5页

张掖市人民政府令第37号张掖市地下水资源管理.. 4页

隔水炖食谱大全 3页

教育培训《终身成长》作品内容简介卡罗尔德韦.. 17页

欧洲赔率与亚洲盘口之盘口篇 66页

桥架行业前景及现状如何 2页

十架七言讲章(定稿) 40页

海绵城市---低影响开发雨水系统关键技术研究项.. 33页