将以上代码修改为可从键盘指定输出
时间: 2024-02-28 17:52:54 浏览: 17
以下是修改后的代码,可以从键盘输入理发师和顾客的数量,并可从键盘指定是否输出调试信息:
```c
#include <windows.h>
#include <stdio.h>
#define MAX_WAITING 100 // 最大等待人数
#define MAX_CHAIRS 10 // 等待椅子数量
HANDLE barberReady; // 理发师准备就绪信号量
HANDLE customerReady; // 顾客准备就绪信号量
HANDLE accessSeats; // 等待椅子互斥信号量
int numberOfFreeSeats = MAX_CHAIRS; // 空闲椅子数量
int numberOfCustomers; // 顾客数量
int numberOfBarbers; // 理发师数量
int debugOutput = 0; // 是否输出调试信息
DWORD WINAPI barber(void* data) {
while (1) {
WaitForSingleObject(customerReady, INFINITE); // 等待顾客
WaitForSingleObject(accessSeats, INFINITE); // 获取等待椅子互斥信号量
numberOfFreeSeats++; // 有一个椅子空闲了
ReleaseSemaphore(barberReady, 1, NULL); // 理发师准备就绪
ReleaseMutex(accessSeats); // 释放互斥信号量
if (debugOutput) {
printf("Barber is cutting hair.\n");
}
Sleep(1000); // 理发师工作一段时间
}
}
DWORD WINAPI customer(void* data) {
int id = *(int*)data;
WaitForSingleObject(accessSeats, INFINITE); // 获取等待椅子互斥信号量
if (numberOfFreeSeats > 0) {
numberOfFreeSeats--; // 有一个椅子被占用了
printf("Customer %d is waiting.\n", id);
ReleaseSemaphore(customerReady, 1, NULL); // 顾客准备就绪
ReleaseMutex(accessSeats); // 释放互斥信号量
WaitForSingleObject(barberReady, INFINITE); // 等待理发师
printf("Customer %d is getting a haircut.\n", id);
}
else {
ReleaseMutex(accessSeats); // 没有空闲椅子,释放互斥信号量
printf("Customer %d has left the barbershop.\n", id);
}
return 0;
}
int main() {
HANDLE* barberThread, * customerThread;
int i, j, customerId[MAX_WAITING];
printf("Please enter the number of barbers: ");
scanf("%d", &numberOfBarbers);
printf("Please enter the number of customers: ");
scanf("%d", &numberOfCustomers);
printf("Do you want to output debug information? (1 for yes, 0 for no): ");
scanf("%d", &debugOutput);
barberReady = CreateSemaphore(NULL, 0, numberOfBarbers, NULL);
customerReady = CreateSemaphore(NULL, 0, numberOfCustomers, NULL);
accessSeats = CreateMutex(NULL, 0, NULL);
barberThread = (HANDLE*)malloc(sizeof(HANDLE) * numberOfBarbers);
customerThread = (HANDLE*)malloc(sizeof(HANDLE) * numberOfCustomers);
for (i = 0; i < numberOfBarbers; i++) {
barberThread[i] = CreateThread(NULL, 0, barber, NULL, 0, NULL);
}
for (i = 0; i < numberOfCustomers; i++) {
customerId[i] = i + 1;
customerThread[i] = CreateThread(NULL, 0, customer, &customerId[i], 0, NULL);
Sleep(1000); // 新客户到达的时间间隔
}
WaitForMultipleObjects(numberOfBarbers, barberThread, TRUE, INFINITE);
WaitForMultipleObjects(numberOfCustomers, customerThread, TRUE, INFINITE);
for (i = 0; i < numberOfBarbers; i++) {
CloseHandle(barberThread[i]);
}
for (i = 0; i < numberOfCustomers; i++) {
CloseHandle(customerThread[i]);
}
CloseHandle(barberReady);
CloseHandle(customerReady);
CloseHandle(accessSeats);
free(barberThread);
free(customerThread);
return 0;
}
```
在修改后的代码中,使用了scanf函数从键盘输入理发师和顾客的数量,以及是否输出调试信息。同时,在多线程等待的时候使用了WaitForMultipleObjects函数来等待所有线程结束。