睡眠理发师课程设计含有源代码docx.docx

上传人:b****9 文档编号:25175280 上传时间:2023-06-05 格式:DOCX 页数:20 大小:51.10KB
下载 相关 举报
睡眠理发师课程设计含有源代码docx.docx_第1页
第1页 / 共20页
睡眠理发师课程设计含有源代码docx.docx_第2页
第2页 / 共20页
睡眠理发师课程设计含有源代码docx.docx_第3页
第3页 / 共20页
睡眠理发师课程设计含有源代码docx.docx_第4页
第4页 / 共20页
睡眠理发师课程设计含有源代码docx.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

睡眠理发师课程设计含有源代码docx.docx

《睡眠理发师课程设计含有源代码docx.docx》由会员分享,可在线阅读,更多相关《睡眠理发师课程设计含有源代码docx.docx(20页珍藏版)》请在冰豆网上搜索。

睡眠理发师课程设计含有源代码docx.docx

睡眠理发师课程设计含有源代码docx

安就理工大爭

课程设计说明书

(操作系统)

题目:

睡眠理发师问题

院系:

计算机科学与工程专业班级:

电子仪器12-2班

学号:

2012303231

学生姓名:

方韬

指导教师:

王军号

 

2014

年12月23日

 

安徽理工大学课程设计(论文)任务书

计算机科学与工程学院

学号

2012303231学生姓名方韬专业(班级)电子仪器12-2

设计题目

睡眠理发师问题

设计技术参数

考虑一个理发店,只有一个理发师,只有n张可供顾客等待理发的椅子,如

果没有顾客,则理发师睡觉;如果有一顾客进入理发店发现理发师在睡觉,则把他叫醒,写一个程序协调理发师和顾客之间的关系。

通过研究Linux的线程机制

和信号量实现睡眠理发师冋题(Sleeping-BarberProblem)的并发控制,用多线

程同步方法解决睡眠理发师问题(Sleeping-BarberProblem)。

设计要求

1、每个顾客进入理发室后,即时显示“Entered”及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置。

2、至少有10个顾客,每人理发至少3秒钟。

3、在完成电子设计后,要求写一份详细的设计报告。

工作量

编写代码不少于200行;程设计说明书不少于15页。

工作计划

第一周:

整体分析,查阅资料;

第二周:

总结出大概设计思路;第三周:

着手实现,写好相应的代码;第四周:

系统调试,完善系统程序。

参考资料

《计算机操作系统》教材

《软件工程》

《C使用手册》

指导教师签字系主任签字

2014年12月23日

安徽理工大学课程设计(论文)成绩评定表

学生姓名:

方韬学号:

2012303231专业班级:

电子仪器12-2

课程设计题目:

睡眠理发师问题

指导教师评语:

成绩:

指导教师:

年月日

1.课程设计要求1

2.课程设计目的1

3.设计思想说明1

4.课程设计内容1

4.1头文件声明1

4.2定义各种变量

4.3信号量的定义

4.4相关函数及线程的定义

5.数据结构说明

6.程序用到的系统调用(API)

7.程序总体算法流程图

8.程序运行

9.源代码

十.总结

参考文献

2.

2

2

2

3

4

••…5

...7

10

11

1.课程设计要求

有一个理发师,一把理发椅和n把提供给等候理发的顾客座的椅子。

如果没有顾客,则理发师便在理发椅子上睡觉;当第一个顾客到来时,必须唤醒该理发师进行理发;如果理发师正在理发时又有顾客到来,则如果有空椅子可坐,他就坐下来等待,如果没

有空椅子,他就离开理发店。

为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件,试用P、

V操作实现。

2.课程设计目的

通过本次课程设计,能深入彻底的弄清楚睡眠理发师问题,能够举一反三,遇到同样的问题能够很快解决。

通过自己的实际操作,认真分析,理解进程,线程,信号量之间的关系和他们的实现过程,掌握一些基本的系统调用的用法及其所实现的功能。

用C++来实现睡眠理发师的课程设计,达到复习C++相关知识的目的。

3.设计思想说明

此题可看作是n个生产者和1个消费者问题。

顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相

当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。

主要有以下一些函数来实现整个问题的实现过程:

(1)用随机函数random()来产生进入理发店的顾客。

(2)定义理发师的理发函数cuthair()用来实现理发操作。

(3)定义顾客被理发的函数gethaircut()用来实现顾客被理发的操作。

(4)用顾客线程customer实现对顾客行为的控制。

(5)用理发师线程barber实现对理发师行为的控制。

(6)定义主函数main实现对两个线程的控制和执行操作。

4.课程设计内容

4.1头文件声明

#include"stdafx.h"

#include"windows.h"

#include"iostream.h"

#include"math.h"

4.2定义各种变量

intlongwaiting(0);

intcharcharintint

chairs;

open_door;close_door;count(0);

finish(0);

4.3信号量的定义

DWORDa;%互斥信号量:

mutex用来互斥对临界变量count的访问

计数信号量customers用来记录等候的顾客数据,barbers用来记录等待的理发师数,这里barbers只有两种取

值,要不是0要不是1

临界变量:

count由理发师进程和顾客进程共同访问,用来记录在椅子上等着的顾客数

N椅子数,为最多等候的顾客数

HANDLEMutex=:

:

CreateMutex(NULL,FALSE,"Mutex");

HANDLEbarbers=:

:

CreateSemaphore(NULL,1,1,"barbers");

HANDLEcustomers=:

:

CreateSemaphore(NULL,0,3,"customers");

4.4相关函数及线程的定义

定义随机函数intrandom()来产生顾客,并使两个顾客间的时间少于15秒

定义理发师的理发函数voidcuthair(),用时15秒

定义顾客被理发的函数voidgethaircut()

定义顾客线程DWORDWINAPIcustomer(LPVOIDpParm2)定义理发师线程DWORDWINAPIbarber(LPVOIDpParm1)定义主函数实现线程的操作intmain(intargc,char*argv[])

5.数据结构说明

本程序用到了数据结构中的队列,理发的顾客由随机函数产生,顾客遵从先到先

理发的原则,但队列的长度限制为输入的理发店中的椅子的个数,当理发店的椅子没有

空位的时候,到来的顾客主动退出加入队列。

理发师对队列中的顾客进行先到先服务的原则理发。

6.程序用到的系统调用(API)

(1)CreateThread():

创建线程

(2)CreateMutex():

找出当前系统是否已经存在指定进程的实例。

如果没有则

创建一个互斥体,用来同步。

如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

CreateMutex()函数可用来创建一个

有名或无名的互斥量对象

(3)CreateSemaphore():

CreateSemaphore()是系统提供的API,包含在Windows.h中,应用在同步的处理中。

作用是创建一个新的信号机,执行成功,返回信号机对象的句柄;零表示出错。

一旦不再需要,一定记住用CloseHandle关闭信号机的句柄。

它的所有句柄都关闭以后,对象自己也会删除。

一旦值大于零,信号机就会触发

(发出信号)。

Semaphore是一个同步问题机制,不论是Event或Mutex,其他Process在执WaitForSingleObject时,就看当时的物件是Signal或UnSignal而决定是否等待,而Semaphore也相同,但是它要变成Signal/UnSignal的状态,却有些不同,它是提

供一个计数值,它允许在这个计数值之内,任何执行到WaitForSingleObject的Thread

都不会停下来,而且每执行WaitForSingleObject—次,计数值就减一,当计数值变成0时,该Semaphore才会处於UnSignal的状态,而某个ThreadReleaseSemaphore时,便会将计数值增加,以便其他的Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。

(4)ReleaseSemaphore():

ReleaseSemaphore()函数的作用是增加信号机的计数。

如果成功,就调用信号机上的一个等待函数来减少它的计数。

(5)WaitForSingleObject():

函数用来检测hHandle事件的信号状态,在某一

线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所

等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返

回。

参数dwMilliseconds有两个具有特殊意义的值:

0和INFINITE。

若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

(6)ResumeThread():

线程恢复函数,使用该函数能激活线程的运行,使CPU分配资源让线程恢复运行。

(7)ReleaseMutex():

释放由线程拥有的一个互斥体

(8)Sleep():

睡眠等待

 

七•程序总体算法流程图

 

 

八.程序运行

 

(1)键入店中的椅子数

g*D:

\Progra>Files\C++BicrosoftVisualStudioMyProjects\babe\Debug\ba.

解翳曙椅子窗

區否开始接荐顾客?

丫刑

(2)键入椅子数后询问是否接待顾客

匚:

\*D:

\Progra>Files\C++BicrosoftVisualStudioMyProjects\babe\Debug\ba.

樹入理发店中的椅子个数詣阳中有碍巴营子足否开始接荐顾客?

S

y

顾客IHi第1个顾客到来医人卷第待理发

蒯鑫3个座位

有仝位,顾客己坐下住在营业,请进I

(3)开始接待顾客,第一个顾客到来

 

曲*D:

\Frogra>Files\C++BicrosoftVisualStudio\ByProjects\babe\Debug\ba...

剩余戈个座位

言空位,顾容己坐下揽发结束t

笫Z个顾客理览完毕,离开

正在营业,请进!

住在犁,一"现善聲卩卜人在等持昨剩尔玄个座检

启空位,顾客已坐下

IIW

七.戛響个顾窖到来

诵理

6进征竟位福

©需

正在背业,fiiti

卩贞客槿门!

#7个顾客到来鞍讒年?

第,个顾客离开理发店第齐范詮理发完毕•离开

(4)依次有顾客到来

臺霧東警已土不

肾4个顾客理发完毕,离开

正在营业,请进!

正在富业,请进!

顾客gni1?

个顾客到来酸更姿以在等待理发剩卿个座隹

有空位,顾客已坐下

理发结東?

第5个顾客理发完毕,离开

门业

蠶吕有⑴位客在在龛仝顾正现剩有

「发

1W

正在营业,WS!

正在营业,请进!

顾客嚴门I第11个顾客到来没有箜柿子,第“个顾客离开理发店

 

网寰越门1«16个顾客到来眉有空椅子,第述个顾客离开理发店

正在亶业,请进!

正在買业,请进I

棘客亀11第1?

丫顾宮到来殳肴鈿子,第弁理发店隹在亶业,请进I正在亶吐,请进!

詹魏曾巖霜葺蘇理发店

18S'蠡;个顾钢来

没有空椅子,第H个顾客离开理发店

»fL子业业诂在在客有正正顾没

诒进I

请进!

弟20个顾客到来

第翻个顾客离弁理发店

(5)还有顾客依次到来

九.源代码

#inelude"stdafx.h"

#inelude"windows.h"

#inelude"iostream.h"

#inelude"math.h"

intlongwaiting(0);

intchairs;

charopen_door;

charclose_door;

intcount(0);

intfinish(0);

//等待理发的顾客人数

//店中椅子的总数目

//开门

//关门

〃顾客的序号

〃已经理完发的顾客人数

DWORDa;(无符号整数32位)

HANDLEMutex二:

:

CreateMutex(NULL,FALSE,"Mutex");//用来实现进程的互斥

HANDLEbarbers

间的同步

=:

:

CreateSemaphore(NULL,1,1,"barbers");/定义信号量来进行线程

HANDLEcustomers=:

:

CreateSemaphore(NULL,0,3,"customers");//定义信号量来进行线程间的同步

intrandom()

//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒

{

return(rand()*15000)/RAND_MAX;

}

voidcuthair()

//理发师的理发函数,用时15秒

{

:

:

Sleep(15000);

cout«"理发结束!

"<

}

voidgethaircut()

//顾客被理发的函数

{

:

:

Sleep(15001);〃顾客被理发的函数,为了和理发师之间有所区别,比理

发师理发时间长1毫秒

coutvv"第"vvfinishvv"个顾客理发完毕,离开"<

}

DWORDWINAPIcustomer(LPVOIDpParm2)

//顾客线程

{

:

:

WaitForSingleObject(Mutex’INFINITE);〃P(mutex)来进行互斥操作

count++;〃来的是第几个顾客

cout«"顾客敲门!

第"<

if(waiting

{

if(waiting!

=0)

{

cout«"现在有"vvwaiting<<"个人在等待理发"<

}

else

coutvv"无人在等待理发"<

waiting++;

coutvv"剩余"vvchairs-waiting+1<<"个座位"<

coutvv"有空位,顾客已坐下"<

:

:

ReleaseSemaphore(customers,1,NULL);//V(customer)

:

:

ResumeThread(customers);〃唤醒理发师进程

:

:

ReleaseMutex(Mutex);〃释放互斥量,以便其他线程使用

:

:

WaitForSingleObject(barbers,INFINITE);//等待理发gethaircut();//理发并离开

}

else

{

coutvv"没有空椅子,第"vvcountvv"个顾客离开理发店"vvendl;//没有椅子,顾客直接离开

:

:

ReleaseMutex(Mutex);

}

return0;

}

DWORDWINAPIbarber(LPVOIDpParml)

//理发师线程

{

while(true)

//外循环

{

:

:

WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客

//等待互斥量

//等待的人数减1

//释放信号量

〃唤醒顾客进程

//v(mutex);

//理发

〃理发完毕的顾客数目加1

:

:

WaitForSingleObject(Mutex,INFINITE);waiting--;

:

:

ReleaseSemaphore(barbers,1,NULL);

:

:

ResumeThread(barbers);

:

:

ReleaseMutex(Mutex);cuthair();

finish++;

}

return0;

}intmain(intargc,char*argv[])

//实现线程的操作

{

coutvv"输入理发店中的椅子个数:

";

cin>>chairs;

cout«"店中有"vvchairsvv"把椅子"<

Y/N"«endl;〃是否开门营业

cin>>open_door;

while(open_door!

='Y')

{

coutvvendlvv"尚未营业!

"<

coutvv"是否开始接待顾客?

Y/N"<

cin>>open_door;

}_

HANDLEhThreadl;

HANDLEhThread2;

hThread2=:

:

CreateThread(NULL,O,barber,NULL,O,NULL);//产生一个理发师进程while(open_door='y')

{_

while(close_door!

='y')

{_

:

:

Sleep(random());〃函数实现顾客随机到来

hThread仁:

:

CreateThread(NULL,0,customer,NULL,a,NULL);

cout«endlvv"正在营业,请进!

"<

if(finish>=8&&waiting==0)

//如果完成数超过8并且没有人等待

{

coutvv"已经为"<

"<

cin>>close_door;

returnclose_door;

}

}

if(close_door=='y')

{_

coutvv"暂停营业!

欢迎下次光临!

"<

return0;

}

return0;

}

十.总结

经过这长达几周的不断机房实验,终于成功完成了此次的数据库课程设计。

课程设计虽然结束了,但在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何

去把握一件事情,如何去做一件事情,又如何完成一件事情。

在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。

学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。

课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.“千里之行始于

足下”通过这次课程设计,我深深体会到这句千古名言的真正含义•我们今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.

在这次设计过程中,我们小组成员之间分工明确,协调一致的工作。

此次课程设计充分体现出小组的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

当然在这过程中,我们也不可避免的遇到了困难。

幸亏有同学和实验老师对我们的帮助。

在此向那些为他们说一声谢谢。

参考文献

[1]庞丽萍阳富民•计算机操作系统(第四版)北京:

人民邮电出版社,2006

[2]RobertLove编著.Linux内核设计与实现.北京:

机械工业出版社,2006

[3]李善平著.Linux内核指导.杭州:

浙江大学出版社,2002

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1