linx下使用线程模拟解决银行排队叫号问题。 在银行中有一个叫号机,有一个10个座位的长椅,客户在叫号后如果无人在柜台前服务,就会去要求服务;如果柜台忙,则会找长椅入座;如果长椅满则会离开。 要求显示输出叫号过程,并分析程序运行状况。
时间: 2024-02-06 07:10:03 浏览: 28
下面是一个使用线程模拟解决银行排队叫号问题的示例程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define MAX_SEATS 10 // 长椅最大座位数
int current_ticket = 0; // 当前叫号
int current_seats = 0; // 当前已有客户数目
int next_seat = 0; // 下一个入座位置
int next_ticket = 1; // 下一个叫号
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t cond_empty = PTHREAD_COND_INITIALIZER; // 空座位条件变量
pthread_cond_t cond_full = PTHREAD_COND_INITIALIZER; // 满座位条件变量
void *customer(void *param) {
int ticket = *(int *)param;
printf("Customer %d got ticket %d.\n", pthread_self(), ticket);
pthread_mutex_lock(&mutex); // 加锁
while (ticket > current_ticket) { // 只有比当前叫号小的才会等待
pthread_cond_wait(&cond_empty, &mutex);
}
if (current_seats < MAX_SEATS) { // 有座位可以入座
printf("Customer %d is taking seat %d.\n", pthread_self(), next_seat);
next_seat++;
current_seats++;
if (current_seats == MAX_SEATS) { // 座位已满
pthread_cond_signal(&cond_full); // 唤醒等待离开的顾客
}
} else { // 没有座位可以入座
printf("Customer %d left because no seats available.\n", pthread_self());
}
pthread_mutex_unlock(&mutex); // 解锁
return NULL;
}
void *counter(void *param) {
while (1) {
pthread_mutex_lock(&mutex); // 加锁
if (current_seats == 0) { // 没有客户在排队
printf("Counter waiting for customer.\n");
pthread_cond_wait(&cond_full, &mutex); // 等待有客户入座
}
current_ticket++;
printf("Counter is serving customer with ticket %d.\n", current_ticket);
pthread_cond_broadcast(&cond_empty); // 唤醒等待入座的顾客
current_seats--; // 客户离开
pthread_mutex_unlock(&mutex); // 解锁
sleep(1); // 服务时间1秒钟
}
}
int main() {
pthread_t counter_tid;
pthread_create(&counter_tid, NULL, counter, NULL); // 创建柜台线程
while (1) {
pthread_t tid;
pthread_create(&tid, NULL, customer, &next_ticket); // 创建顾客线程
next_ticket++;
sleep(1); // 模拟顾客的到达时间间隔
}
pthread_join(counter_tid, NULL); // 等待柜台线程结束
return 0;
}
```
程序中,每个顾客都是一个线程,它会等待自己的叫号比当前叫号小,然后尝试入座。如果有座位可以入座,就占据一个座位,并唤醒等待离开的顾客。如果没有座位可以入座,就离开。柜台是另外一个线程,它会不断地叫号并服务客户,直到没有客户为止。
运行程序后,可以看到输出的叫号过程和客户的行为。程序的运行状况可以通过观察输出来分析。