进程并发-信号量经典例题-面包师问题

文章讨论了如何使用信号量的P、V操作设计一个销售场景的同步算法,确保顾客取号和销售员叫号的互斥性,以及销售员在有顾客时才能叫号,顾客在有店员时才能购买面包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 题目描述

面包师有很多面包和蛋糕,由N个销售人员销售。每个顾客进店后先取一个号,并且等着叫号。当一个销售人员空闲下来,就叫下一个号。试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

2 条件分析

题目需要满足的要求

1 顾客之前取号要互斥,保证每一个顾客取到的号码不一样,引入mutex_sale

2 销售员叫号之间也要互斥 引入mutex_customer

3 销售员在卖面包之前,要保证1有顾客,2叫到号

4 顾客在买面包之前,要保证1 有店员 2 叫到号

3 伪代码实现

1.customer_ticket=0 //取号数  
2.sale_ticket=0  //叫号数  
3.mutex_sale=1;//销售员之间叫号要互斥  
4.mutex_customer=1;//顾客之间叫号要互斥  
5.sale_number=N;//店员人数  
6.customer_number=0//顾客人数  
7.int   
8.void Sale(void){  
9.    while(1){  
10.        P(customer_number) //等待顾客到来  
11.        P(mutex_sale);//销售员申请叫号  
12.        sale_ticket++;  
13.        V(mutex_sale);//销售员释放叫号  
14.        sell_bread(); //卖面包  
15.        V(sale_number);//释放店员占用  
16.    }  
17.      
18.}  
19.void Customers(void){  
20.    while(1){  
21.        P(mutex_customer) //申请取号  
22.        customer_ticket++;  
23.        V(mutex_customer) //释放取号  
24.        V(customer_number)  
25.        P(sale_number);//请求店员服务  
26.        buy_bread();  
27.    }  
28.      
29.}  

系列文章如下

学习过程中一定要有系统观念(知识框架,每一章开头都会有一个思维导图),知道目前自己在学习的是哪一板块的内容,和前面有什么样的联系

操作系统的很多知识点前后都是联系非常紧密的,去一点一点理解而不是死记硬背会学习的非常愉快的!!!

操作系统相关文章

概述,初步了解操作系统功能及其一些概念

操作系统(一)| 概述 作业 批处理 OS运行环境要求 基本特征-CSDN博客

进程管理部分,重头戏

操作系统(二 )| 进程控制 进程状态 进程描述 进程控制 进程同步互斥-CSDN博客

操作系统(三)| 进程管理上 进程状态 同步 互斥-CSDN博客

操作系统(三)| 进程管理下 经典进程问题分析 线程 死锁-CSDN博客

内存管理部分

操作系统(四)| 内存管理 实存储器管理 虚拟存储器管理 分页 分段式管理-CSDN博客

文件系统管理部分

操作系统(五)| 文件系统上 结构 存取方式 文件目录 检索-CSDN博客

操作系统(六)| 文件系统下 文件使用 共享 保护-CSDN博客

设备管理部分

操作系统(七)| 设备管理-- 端口 驱动程序 基本I/O控制 磁盘I/O-CSDN博客


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值