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

顾客 11 来了 没有可供顾客等待的椅子了,顾客 11 离开了 顾客 3 离开了 顾客 4 正在理发 顾客 12 来了 顾客 12 正在等待理发师 顾客 13 来了 没有可供顾客等待的椅子了,顾客 13 离开了 顾客 14 来了 没有可供顾客等待的椅子了,顾客 14 离开了 顾客 15 来了 没有可供顾客等待的椅子了,顾客 15 离开了 顾客 4 离开了 顾客 5 正在理发 顾客 16 来了 顾客 16 正在等待理发师 顾客 17 来了 没有可供顾客等待的椅子了,顾客 17 离开了 顾客 18 来了 没有可供顾客等待的椅子了,顾客 18 离开了 顾客 19 来了 没有可供顾客等待的椅子了,顾客 19 离开了 顾客 5 离开了 顾客 9 正在理发 顾客 20 来了 顾客 20 正在等待理发师 顾客 9 离开了 顾客 12 正在理发 顾客 12 离开了 顾客 16 正在理发 顾客 16 离开了 现在理发店只有顾客 20,理发师是清醒的 顾客 20 正在理发 顾客 20 离开了 没有顾客了,理发师开始睡觉
busy = 0; notify();// 唤醒 } if (cnt == 0) { System.out.println("没有顾客了,理发师开始睡觉"); } } } }
class Barber implements Runnable { BarberShop ob; int index;
public Barber(BarberShop ob, int i) { this.ob = ob; index = i;
}
public synchronized boolean isBusy() { if (busy == 1) { return true; } return false;
进程之间的同步互斥与通信理发师问题操作系统

操作系统课程设计目录1. 课程设计目的 (3)2. 设计要求 (3)3. 问题具体描述 (3)4. 设计分析 (3)5. 设计分工 (4)6. 数据结构说明 (4)7. 系统结构说明 (4)8. 系统调用说明 (4)9. 分工设计说明 (5)10. 算法流程图 (5)11. 分工代码 (6)12. 整体代码 (7)13. 程序运行 (10)14. 总结 (11)1.课程设计目的1.内容围绕操作系统原理中最重要的基本概念和基本原理展开2.巩固对原理知识的学习效果3.加深对基本概念的理解4.学习如何将基本原理和实际设计、应用有机结合5.锻炼本专业的基本能力2.设计要求1:进程间通信、并发(同步/互斥)、文件读写2:内存管理、Dll、Windows消息机制、IO (尚未最终定型)3.问题具体描述1.完成N个生产者和M个消费者之间的并发控制,N、M不低于5,数据发送和接收缓冲区大小不小于10个。
2.某个生产者进程生产的消息供K个消费者进程消费。
K《=M。
某些消费进程消费多个生产者生产的消息。
生产者和消费者之间的对应关系可以在程序开始有一个文件中读入,也可以动态调整。
3.每个生产进程生产M个消息后结束运行。
如果一个消费者进程没有对应的生产者进程在运行后,也结束运行。
4.设计分析课程设计的主要目的是了解并且掌握进程之间的同步互斥,和进程之间的通信问题。
结合课本上的生产者与消费者问题可以从这方面来实现一个多进程的小系统,并且解决多个进程之间的通信,并发等问题,以此来达到课程设计的目的。
理发师问题是将顾客看做生产者,将理发师作为消费者。
设置一定数量的椅子的数目来作为缓存区的大小。
顾客来到的时候坐在椅子上,将自己作为“产品”,理发师理发的时候从椅子上叫走顾客,相当于消费“产品”,从而达到了课程设计要求的前一个要求。
顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。
操作系统概念(第七版翻译版)复习题

2011-12操作系统复习题(一)进程同步●进程同步1进程P1和进程P2并发执行时满足一定的时序关系,P1的代码段S1执行完后,才能执行P2的代码段S2.为描述这种同步关系, :试设计相应的信号量, :给出信号量的初始值,●:给出进程P1和P2的结构●进程同步2问题描述:(理发店问题)一个理发店有一间配有n个椅子的等待室和一个有理发椅的理发室。
如果没有顾客,理发师就睡觉;如果顾客来了二所有的椅子都有人,顾客就离去;如果理发师在忙而有空的椅子,顾客就会坐在其中一个椅子;如果理发师在睡觉,顾客会摇醒他。
①给出同步关系②设计描述同步关系的信号量;③给出满足同步关系的进程结构(请完成满足同步关系的进程结构)。
进程同步2设公共汽车上,司机和售票员的活动分别为:司机的活动为启动车辆,正常行车,到站停车;售票员的活动为关车门,售票,开车门。
给出在汽车不断地到站、停车、行驶过程中,司机和售票员的活动的同步关系。
用信号量和wait, signal操作实现他们间的协调操作。
进程同步3:某高校计算机系开设网络课并安排上机实习,假设机房共有2m台机器,有2n名学生选该课,规定:(1)每两个学生组成一组,各占一台机器,协同完成上机实习;(2)只有凑够两个学生,并且此时机房有空闲机器,门卫才允许该组学生进入机房;(3)上机实习由一名教师检查,检查完毕,一组学生才可以离开机房。
试用信号量机制实现它们的同步关系。
●进程同步4:多个进程对信号量S进行了5次 wait操作,2次signal操作后,现在信号量的值是-3,与信号量S相关的处于阻塞状态的进程有几个?信号量的初值是多少?●进程同步5:使用两个进程计算Y=F1(X)+F2 (X). 在这个问题中,F1(X)和F2 (X)的计算是可以并行处理的,因此F1(X)和F2 (X)可以分别出现在两个进程中。
在F1(X)+F2 (X)中,必须在F1(X)和F2(X)计算完毕,才能进行加法运算,因此本问题是同步问题。
操作系统课程设计用多进程同步方法解决生产者消费者问题

操作系统课程设计⽤多进程同步⽅法解决⽣产者消费者问题操作系统课程设计⽤多进程同步⽅法解决⽣产者-消费者问题系别:计科系专业: 计算机科学与技术班级:04 级 4 班学号:0410*******姓名:苏德洪时间:2006-7-7—2006-7-14⽬录⼀、题⽬: (3)⼆、设计⽬的: (3)三、总体设计思想概述: (3)四、说明: (3)五、设计要求: (3)六、设计⽅案: (3)七、流程图: (5)⼋、运⾏结果 (7)九、源程序 (11)⼗、总结 (18)⼗⼀、参考⽂献 (20)⼀、题⽬:⽤多进程同步⽅法解决⽣产者-消费者问题。
⼆、设计⽬的:通过研究Linux 的进程机制和信号量实现⽣产者消费者问题的并发控制。
三、总体设计思想概述:1、⽣产者—消费者问题是⼀种同步问题的抽象描述。
2、计算机系统中的每个进程都可以消费或⽣产某类资源。
当系统中某⼀进程使⽤某⼀资源时,可以看作是消耗,且该进程称为消费者。
3、⽽当某个进程释放资源时,则它就相当⼀个⽣产者。
四、说明:有界缓冲区内设有20个存储单元,放⼊/取出的数据项设定为1-20这20个整型数。
1、每个⽣产者和消费者对有界缓冲区进⾏操作后,即时显⽰有界缓冲区的全部内容,当前指针位置和⽣产者/消费者线程的标识符。
2、⽣产者和消费者各有两个以上。
3、多个⽣产者或多个消费者之间须有共享对缓冲区进⾏操作的函数代码。
六、设计⽅案:通过⼀个有界缓冲区(⽤数组来实现,类似循环队列)把⽣产者和消费者联系起来。
假定⽣产者和消费者的优先级是相同的,只要缓冲区未满,⽣产者就可以⽣产产品并将产品送⼊缓冲区。
类似地,只要缓冲区未空,消费者就可以从缓冲区中去⾛产品并消费它。
应该禁⽌⽣产者向满的缓冲区送⼊产品,同时也应该禁⽌消费者从空的缓冲区中取出产品,这⼀机制有⽣产者线程和消费者线程之间的互斥关系来实现。
为解决⽣产者/消费者问题,应该设置两个资源信号量,其中⼀个表⽰空缓冲区的数⽬,⽤g_hFullSemaphore表⽰,其初始值为有界缓冲区的⼤⼩SIZE_OF_BUFFER;另⼀个表⽰缓冲区中产品的数⽬,⽤g_hEmptySemaphore表⽰,其初始值为0。
操作系统实验五 理发师问题

实验题目:理发师问问题学号:201000130133 班级: 2010级计算机4班姓名:郑思雨 Email:1412561943@实验目的:1、进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法。
2、加深对于非对称性互斥问题有关概念的理解。
观察和体验非对称性互斥问题的并发控制方法。
3、进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。
硬件环境:微机(多核,4GB 以上内存,320GB 以上硬盘)软件环境:Ubuntu-Linux 操作系统Gnome 桌面gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1、了解实验的目的,了解并掌握与进程间通信IPC中的3个对象:共享内存、信号灯数组、消息队列到呢个有关的系统调用,并能熟练的掌握。
2、阅读实验题目并分析实验的需求。
理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。
此外还有一间等候室,可容纳13位顾客等候进入理发室。
顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。
在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。
顾客理完发后,可向任何一位理发师付款。
但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。
理发师在没有顾客的时候就坐在理发椅子上睡眠。
理发师的时间就用在理发、收款、睡眠上。
(1)首先创建ipc.h文件,在里面定义生产者/消费者共用的IPC函数的原型和变量。
(2)然后创建ipc.c文件,在里面定义生产者/消费者共用的IPC 的具体的相应函数。
(3)创建sofa_control文件,在里面声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以让顾客到理发椅上进行理发。
《操作系统》课程设计报告要求

《操作系统》课程设计报告专业:计算机科学与技术班级:题目名称:睡眠理发师问题完成日期:目录1.问题描述 (4)2.课程设计目的 (4)3.课程设计思想 (4)3.1设计思想 (4)3.2多线程编程原理 (5)3.3创建一个线程 (5)3.4等待一个线程结束 (5)3.5信号量 (6)3.6 伪码实现 (6)4.程序采用的数据结构 (7)5.程序采用的系统调用 (7)6.程序开发及运行环境 (8)7.程序总体框图 (8)8.程序各模块的功能 (10)9.程序各模块的流程图 (10)9.1理发师(Barber)模块 (10)9.2顾客(Customer)模块 (11)10.程序的运行 (13)10.1 VC环境下源程序 (13)10.2 运行步骤及结果 (13)11.课程设计总结 (15)12.参考文献 (16)13.附录 (16)1.问题描述问题描述:这是一种经典的IPC问题,理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。
如果没有顾客,则理发师在理发椅上睡觉,顾客理来时,如理发师闲则理发,否则如有空椅则坐等,没有空椅则离开,编写程序实现理发师和顾客程序,实现进程控制,要求不能出现竞争。
(2)将(1)题中问题修改为有两位理发师,设计程序实现同步控制。
问题提示:可以用一个变量waitting来记录等候理发的顾客数,另使用三个信号量:用来记录等候理发的顾客数customers;用来记录理发师是否空闲的信号量barbers,一个用于互斥访问waitting变量的mutex.。
2.课程设计目的目的:了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。
3.课程设计思想3.1设计思想睡眠理发师问题是一种同步问题的抽象描述,该问题主要的活动单元是理发师和顾客到来这两个。
其中,理发师有活动有理发和睡觉两个事件;顾客有到来,等待和离去三个事件。
店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。
用多线程同步方法解决睡眠理发师问题

difine n 5; //为顾客准备的椅子数为5
semaphore mutex=1; //用于互斥
semaphore customers=0;//等候理发的顾客数
semaphore barbers=1;//正在等候顾客的理发师数
int waiting=0; //等候理发的顾客数
//理发师线程
void barber()
{
while(true) //判断有无顾客
{
wait(customers); //若无顾客,理发师睡眠
wait(mutex); //互斥
waiting--; //等候顾客数少一个
signal(mutex); //释放临界资源
signal(barber); //理发师去为一个顾客理发
cut_hair; //正在理发
}
}
//顾客线程
void customer()
{
wait(mutex); //互斥
if (waiting<n) //如果有空椅子,则等待
{
waiting++; //等候顾客数加1
signal(mutex); //释放临界资源
signal(customers); //如果理发师睡觉,唤醒理发师
操作系统课程设计----Sleeping-Barber Problem
wait(barber); //理发师在理发, 顾客等候
get_haircut; //顾客坐下等理发师
}
else
signal(mutex); //店里人满了,顾客离开
}
}
2。
理发师问题

Linux系统分析实验报告用信号量解决理发师问题061261008 蒋炎岩(一班)1 实验要求理发师问题:理发店理有一位理发师、一把理发椅和5把供等候理发的顾客坐的椅子。
如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。
用Linux线程机制和信号量机制解决这个问题,并且:(1)每个顾客进入理发室后,即时显示“Entered”及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置(2)至少有10个顾客,每人理发至少3秒钟。
(3)多个顾客须共享操作函数代码。
2 背景知识2.1 POSIX线程在一个程序中的多个执行路线称之为线程。
Linux在1996年第一次获得线程支持,现在已经有一套完整的与线程有关的函数库调用,大多数以pthread_开头,编译时需要用-lpthread选项进行连接。
我们用函数pthread_create创建一个新线程:#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);thread参数表示新线程的标识符;attr用于设置线程属性,如不需要设置,可设置为NULL;start_routine标识了线程启动程序的入口,arg为传入的参数。
调用pthread_create 就可以立即创建一个新的执行路线,与原有线程共享所有的主存空间,但拥有独立的堆栈。
2.2 信号量信号量通过一个计数器控制对共享资源的访问。
如果计数器大于0,则访问被允许,如果为0,则访问被禁止。
计数器计算的结果是允许访问共享资源的通行证。
因此,为了访问共享资源,线程必须从信号量得到通行证(P操作),如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XXXXXXXXXXXXXXX 课程设计题目用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem) 学院计算机科学与技术学院专业软件工程班级姓名指导教师2010 年 6 月28 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)初始条件:1.操作系统:Linux2.程序设计语言: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用于互斥,初值为12.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));第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。
2.2.3 信号量(1)函数sem_init()用来初始化一个信号量,函数原型为:extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。
(2)函数sem_post( sem_t *sem )用来增加信号量的值。
当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
(3)函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。
函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。
2.3 伪码实现difine n 5; //为顾客准备的椅子数为5semaphore mutex=1; //用于互斥semaphore customers=0;//等候理发的顾客数semaphore barbers=1;//正在等候顾客的理发师数int waiting=0; //等候理发的顾客数//理发师线程void barber(){while(true) //判断有无顾客{wait(customers); //若无顾客,理发师睡眠wait(mutex); //互斥waiting--; //等候顾客数少一个signal(mutex); //释放临界资源signal(barber); //理发师去为一个顾客理发cut_hair; //正在理发}}//顾客线程void customer(){wait(mutex); //互斥if (waiting<n) //如果有空椅子,则等待{waiting++; //等候顾客数加1signal(mutex); //释放临界资源signal(customers); //如果理发师睡觉,唤醒理发师 wait(barber); //理发师在理发, 顾客等候get_haircut; //顾客坐下等理发师}elsesignal(mutex); //店里人满了,顾客离开}}2.4 开发环境与工具系统平台:LINUX环境实现语言:C语言开发工具:NANO编辑器3数据结构与模块说明3.1 数据结构通过分析课程设计要求,定义以下的数据:sem_t mutex,customers,barbers;//design three semaphores: mutex,customer,barbers int waiting=0; //the number of waiting customersint chair[5];3.2程序模块说明3.2.1主函数模块主函数流程图如下:3.2.2 理发师模块理发师模块函数流程图如下:3.2.3 顾客模块顾客模块函数流程图如下:4源程序4.1用户名、源程序名和目标程序名用户名:rj070234源程序名:SleepingBarber.c目标程序名:SleepingBarber主机IP地址:192.168.1.2544.2源程序代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>#include<semaphore.h>#include<fcntl.h>#include<errno.h>#define n 5 //the shop have five chairs//design three semaphores: mutex,customer,barberssem_t mutex,customers,barbers;int waiting=0; //the number of waiting customersint chair[5];void * barber();void * customer(void *arg);int main(int argc,char *argv[]){//create 10 semaphores and one Barber semaphorepthread_t Customer_id[10],Barber_id;int i;sem_init(&mutex,0,1); //init mutex semaphore to 1sem_init(&customers,0,0);//init semaphore customers to 0 sem_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);return 0;}//creat barber pthreadvoid * barber(){int i;int next;//wait(customers),if no customers,barber sleepingsem_wait(&customers);sem_wait(&mutex); //wait(mutex)waiting--; //the numer of waiting reduce onefor(i=0;i<5;i++){if (chair[i]!=0){next= chair[i];chair[i]=0;break;}}printf("The barber is cutting %dth customer's hair\n",next);sleep(3);sem_post(&mutex);sem_post(&barbers);}//creat customer pthreadvoid * customer(void *arg){int i;sem_wait(&mutex); //wait(mutex) if(waiting<n)if(waiting<n){waiting++; //the numer of waiting plus onefor(i=0;i<5;i++){if (chair[i]==0){chair[i]=(int)arg;break;}}printf("***************************************************\n");printf("Entered:Number %d customer comes,and sits at %d chair \n",(int)arg,(i+1));printf("There are %d customer on the chair\n",waiting);printf("The customers' location are:");for(i=0;i<5;i++)printf("%d ",chair[i]);printf("\n");sleep(1);sem_post(&mutex); //signal(mutex)sem_post(&customers); //signal(customers)sem_wait(&barbers); //wait(barbers)}else{printf("Number %d comes,there are no chairs,the customer %d is leaving\n",(int)arg,(int)arg);sem_post(&mutex);}}5运行结果5.1运行步骤(1) 打开桌面上的putty.exe,输入IP地址192.168.1.254,进入开发环境。