银行服务系统:用信号量实现顾客与营业员操作的互斥和同步
```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define CUSTOMERS 10 // 顾客数量 #define SEATS 10 // 等待座位数量 sem_t seats; // 空余座位数量的资源信号量 sem_t mutex; // 互斥信号量,用于实现对取号机的互斥访问 sem_t customer; // 顾客数量的资源信号量 void *customer_process(void *arg) { int id = *(int *)arg; sem_wait(&seats); // 等待有空座位 sem_wait(&mutex); // 锁住取号机 printf("顾客 %d 取号成功,等待叫号\n", id); sem_post(&mutex); // 释放取号机锁 sem_post(&customer); // 增加等待服务的顾客数 sem_wait(&mutex); // 锁住取号机,模拟等待服务 printf("顾客 %d 正在接受服务\n", id); sleep(rand() % 5 + 1); // 模拟服务时间 printf("顾客 %d 服务结束,离开银行\n", id); sem_post(&mutex); // 释放取号机锁 sem_post(&seats); // 释放座位 } void *teller_process(void *arg) { while (1) { sem_wait(&customer); // 等待有顾客需要服务 sem_wait(&mutex); // 锁住取号机,准备叫号 printf("营业员叫号,开始为顾客服务\n"); sem_post(&mutex); // 释放取号机锁 } } int main() { pthread_t customers[CUSTOMERS]; pthread_t teller; int ids[CUSTOMERS]; sem_init(&seats, 0, SEATS); // 初始化空余座位数量的资源信号量 sem_init(&mutex, 0, 1); // 初始化互斥信号量 sem_init(&customer, 0, 0); // 初始化顾客数量的资源信号量 for (int i = 0; i < CUSTOMERS; i++) { ids[i] = i + 1; pthread_create(&customers[i], NULL, customer_process, &ids[i]); } pthread_create(&teller, NULL, teller_process, NULL); for (int i = 0; i < CUSTOMERS; i++) { pthread_join(customers[i], NULL); } pthread_cancel(teller); sem_destroy(&seats); sem_destroy(&mutex); sem_destroy(&customer); return 0; } ``` 需要注意的逻辑点: 1. 信号量初始化:确保所有信号量在使用前都正确初始化,特别是资源信号量 `seats` 和 `customer`,它们的初始值应该反映实际的资源情况。 2. 互斥访问:使用互斥信号量 `mutex` 来保护共享资源(如取号机),防止多个线程同时访问导致数据不一致。 3. 服务顺序:营业员通过 `sem_wait(&customer)` 等待有顾客需要服务,确保每次只有一位顾客接受服务,避免并发问题。 ######[AI写代码神器 | 731点数解答 | 2024-12-13 14:42:20]
- 银行服务同步:用信号量实现顾客与营业员的高效交互(阿里通义 | 539点数解答 | 2024-12-13 14:41:41)360
- 银行服务系统:用信号量实现顾客与营业员操作的互斥和同步(阿里通义 | 731点数解答 | 2024-12-13 14:42:20)206
- Python实现Q老师成绩管理任务:修改与查看学生成绩(字节豆包 | 191点数解答 | 2025-12-20 20:55:41)70
- Python 代码助力 Q 老师高效管理班级学生成绩:修改与查看一键搞定(字节豆包 | 326点数解答 | 2025-12-27 20:48:12)70
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- Python开发必懂:同步、异步、阻塞、非阻塞概念全解析(阿里通义 | 263点数解答 | 2023-11-08 00:56:38)235
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 深度剖析:黑盒、白盒、单元、集成、系统与验收测试的区别与联系 (百度文心 | 424点数解答 | 2023-11-09 18:24:11)299
- Spring Boot 打造 MallShop 购物商城:多角色权限、全业务功能的 Web 应用奇迹 (GPT | 1095点数解答 | 2024-12-09 14:06:47)366
- C++实现银行排队系统:从思路到代码的完整解析(讯飞星火 | 2048点数解答 | 2024-12-11 15:11:23)487
- Windows 10 下用按键精灵:鼠标左键一键绑定窗口及代码详解与注意要点(字节豆包 | 509点数解答 | 2025-08-24 23:34:49)234
- Windows 10 下按键精灵:鼠标左键一次点击绑定窗口代码详解及开发注意事项 (字节豆包 | 372点数解答 | 2025-08-24 23:43:42)160