操作系统课程设计用多线程同步方法解决睡眠理发师问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

XXXXXXXXXXXXXXX 课程设计

题目用多线程同步方法解决睡眠理发师问

题(Sleeping-Barber Problem) 学院计算机科学与技术学院

专业软件工程

班级

姓名

指导教师

2010 年 6 月28 日

课程设计任务书

学生姓名:专业班级:

指导教师:工作单位:

题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)

初始条件:

1.操作系统:Linux

2.程序设计语言:C语言

3. 设有一个理发师,5把椅子(另外还有一把理发椅),几把椅子可用连续存储单元。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1.技术要求:

1)为每个理发师/顾客产生一个线程,设计正确的同步算法

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

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

4)多个顾客须共享操作函数代码。

2.设计说明书内容要求:

1)设计题目与要求

2)总的设计思想及系统平台、语言、工具等。

3)数据结构与模块说明(功能与流程图)

4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机IP地址和目录。)

5)运行结果与运行情况

(提示: (1)连续存储区可用数组实现。

(2)编译命令可用:cc -lpthread -o 目标文件名源文件名

(3)多线程编程方法参见附件。)

3. 调试报告:

1) 调试记录

2)自我评析和总结

上机时间安排:

18周一~ 五08:0 -12:00

指导教师签名:年月日

系主任(或责任教师)签名:年月日

目录

1设计题目与要求 (4)

1.1 设计题目 (4)

1.2 设计要求 (4)

1.2.1 初始条件 (4)

1.2.2 技术要求 (4)

2 总体设计思想及开发环境与工具 (4)

2.1 总体设计思想 (4)

2.2 多线程编程原理 (5)

2.2.1 创建一个线程 (5)

2.2.2 等待一个线程结束 (5)

2.2.3 信号量 (6)

2.3 伪码实现 (6)

2.4 开发环境与工具 (7)

3数据结构与模块说明 (8)

3.1 数据结构 (8)

3.2程序模块说明 (8)

3.2.1主函数模块 (8)

3.2.2 理发师模块 (9)

3.2.3 顾客模块 (9)

4源程序 (10)

4.1用户名、源程序名和目标程序名 (10)

4.2源程序代码 (11)

5运行结果 (14)

5.1运行步骤 (14)

5.2运行结果 (15)

5.2.1 编辑,编译和运行的过程图 (15)

5.2.2 错误部分截图 (16)

5.2.3 正确运行结果图 (16)

6调试记录 (18)

6.1调试记录 (18)

6.2自我评析和总结 (19)

7参考文献 (19)

1设计题目与要求

1.1 设计题目

用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)

1.2 设计要求

1.2.1 初始条件

(1)操作系统:Linux

(2)程序设计语言:C语言

(3)设有一个理发师,5把椅子(另外还有一把理发椅),几把椅子可用连续存储单元。

1.2.2 技术要求

(1)为每个理发师/顾客产生一个线程,设计正确的同步算法

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

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

(4)多个顾客须共享操作函数代码。

2 总体设计思想及开发环境与工具

2.1 总体设计思想

题目中要求描述理发师和顾客的行为,因此需要两类线程barber()和customer ()分别描述理发师和顾客的行为。其中,理发师有活动有理发和睡觉两个事件;等待和理发二个事件。店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。所以,顾客和理

发师之间的关系表现为:

(1)理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。

(2)理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。

(3)故引入3个信号量和一个控制变量:

ⅰ控制变量waiting用来记录等候理发的顾客数,初值为0;

ⅱ信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;

ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;

ⅳ信号量mutex用于互斥,初值为1

2.2 多线程编程原理

此次在Linux下进行多线程编程需要用到pthread_create和pthread_join这两个函数。

2.2.1 创建一个线程

pthread_create用来创建一个线程,原型为:

extern int pthread_create((pthread_t *__thread, __const pthread_attr_t *__attr,void *(*__start_routine) (void *), void *__arg))

第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。函数thread不需要参数时,最后一个参数设为空指针。第二个参数设为空指针时,将生成默认属性的线程。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

2.2.2 等待一个线程结束

pthread_join用来等待一个线程的结束,函数原型为:

extern int pthread_join __P ((pthread_t __th, void **__thread_return));

相关文档
最新文档