一个快餐厅有4 类职员:( l )领班:接受顾客点菜;( 2 )厨师:准备顾客的饭菜;( 3 ) 包工:将做好的饭菜打包;( 4 )出纳员:收款并提交食品。每个职员可被看作一个进程,试用一种同步机制写,用wait 和signal写
时间: 2024-10-10 12:05:13 浏览: 16
在使用wait()和signal()这两个低级同步原语来设计这种快餐店员工协同工作的场景时,我们需要确保四个角色(领班、厨师、包工、出纳员)之间的工作流程能够顺利进行,避免冲突。这里我们可以简单地假设它们遵循一个顺序模式,即先接收订单、然后准备食物、打包、最后付款。
以下是基于信号量的一个简单示例:
```c
#include <semaphore.h>
// 定义信号量,用于控制任务之间的同步
#define ORDER_SEM 1
#define FOOD_SEM 1
#define PACKAGE_SEM 1
#define PAYMENT_SEM 1
void waiter(int* order_semaphore) {
// 领班等待订单
sem_wait(order_semaphore);
// 接收顾客点菜
// ...
// 提供服务后释放订单信号量
sem_post(order_semaphore);
}
void cook(int* food_semaphore) {
// 厨师在收到订单后开始准备食物
sem_wait(order_semaphore); // 等待服务员传递订单
// 准备食物
// ...
// 食物准备好后释放食物信号量
sem_post(food_semaphore);
}
void packager(int* package_semaphore) {
// 包工接收到信号后开始打包
sem_wait(food_semaphore); // 等待厨师完成食物准备
// 打包
// ...
// 打包完成后释放包装信号量
sem_post(package_semaphore);
}
void cashier(int* payment_semaphore) {
// 出纳员等待食物打包好
sem_wait(package_semaphore);
// 收款并提交食品
// ...
// 结束后释放支付信号量
sem_post(payment_semaphore);
}
int main() {
int order_semaphore = ORDER_SEM;
int food_semaphore = FOOD_SEM;
int package_semaphore = PACKAGE_SEM;
int payment_semaphore = PAYMENT_SEM;
waiter(&order_semaphore);
cook(&food_semaphore);
packager(&package_semaphore);
cashier(&payment_semaphore);
return 0;
}
```
在这个例子中,每个函数通过wait()锁定对应的任务信号量,完成工作后再通过sem_post()通知下一个角色可以继续。这样就实现了领班(waiter)、厨师(cook)、包工(packager)和出纳员(cashier)之间的协作和同步。
阅读全文