信号量解决理发师问题C语言完整代码加注释
时间: 2023-08-20 15:05:13 浏览: 127
好的,下面是使用信号量解决理发师问题的完整代码,已加上注释,希望能帮助到您:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_CUSTOMERS 5 // 最大顾客数
sem_t barber; // 理发师信号量
sem_t customer; // 顾客信号量
sem_t mutex; // 互斥信号量
int customer_count = 0; // 当前顾客数
void customer() {
sem_wait(&mutex); // 锁定共享资源
if (customer_count < MAX_CUSTOMERS) { // 如果还有空位就进去理发店
customer_count++; // 顾客数量加一
printf("A customer entered the barber shop, there are %d customers waiting.\n", customer_count);
sem_post(&customer); // 唤醒理发师
sem_post(&mutex); // 解锁共享资源
sem_wait(&barber); // 等待理发师理发
printf("The barber finished the haircut and the customer left.\n");
} else { // 否则离开
printf("The barber shop is full, a customer left.\n");
sem_post(&mutex); // 解锁共享资源
}
}
int main() {
sem_init(&barber, 0, 0); // 初始化理发师信号量为0
sem_init(&customer, 0, 0); // 初始化顾客信号量为0
sem_init(&mutex, 0, 1); // 初始化互斥信号量为1
pthread_t customers[MAX_CUSTOMERS];
for (int i = 0; i < MAX_CUSTOMERS; i++) {
pthread_create(&customers[i], NULL, (void *)customer, NULL);
}
// 理发师工作
while (1) {
sem_wait(&customer); // 等待顾客到来
sem_wait(&mutex); // 锁定共享资源
customer_count--; // 顾客数量减一
sem_post(&barber); // 叫理发师理发
sem_post(&mutex); // 解锁共享资源
printf("The barber is cutting hair.\n");
// 理发师理发
}
return 0;
}
```
这个程序中,我们使用了三个信号量:barber、customer 和 mutex。其中,barber 和 customer 分别用于控制理发师和顾客的状态,mutex 用于控制对共享资源的访问。我们在主函数中初始化了这三个信号量,并创建了一定数量的顾客线程,让他们去理发店理发。在理发师工作的 while 循环中,使用了 sem_wait 和 sem_post 函数来控制理发师和顾客的状态和行为。
希望这个完整的代码和注释对您有所帮助。
阅读全文