C语言多线程影剧院模拟程序
时间: 2024-01-13 20:03:54 浏览: 43
以下是一个简单的C语言多线程影剧院模拟程序,它可以模拟影院售票和退票的过程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_SEATS 50 // 影厅座位数
#define NUM_THREADS 20 // 售票员和退票员数量
int num_tickets_sold = 0; // 已售票数
int num_tickets_refunded = 0; // 已退票数
int num_seats_available = NUM_SEATS; // 剩余座位数
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
void *sell_tickets(void *arg) {
int num_tickets = rand() % 4 + 1; // 随机售票数量
pthread_mutex_lock(&mutex); // 加锁
if (num_seats_available >= num_tickets) { // 如果有足够的座位
num_seats_available -= num_tickets; // 更新座位数
num_tickets_sold += num_tickets; // 更新售票数
printf("%d tickets sold by thread %ld\n", num_tickets, pthread_self());
} else {
printf("Not enough seats available for thread %ld\n", pthread_self());
}
pthread_mutex_unlock(&mutex); // 解锁
pthread_exit(NULL);
}
void *refund_tickets(void *arg) {
int num_tickets = rand() % 2 + 1; // 随机退票数量
pthread_mutex_lock(&mutex); // 加锁
if (num_tickets_sold >= num_tickets) { // 如果有足够的已售票数
num_seats_available += num_tickets; // 更新座位数
num_tickets_sold -= num_tickets; // 更新售票数
num_tickets_refunded += num_tickets; // 更新退票数
printf("%d tickets refunded by thread %ld\n", num_tickets, pthread_self());
} else {
printf("Not enough tickets sold for thread %ld\n", pthread_self());
}
pthread_mutex_unlock(&mutex); // 解锁
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int i;
for (i = 0; i < NUM_THREADS; i++) {
if (i % 2 == 0) { // 偶数线程为售票员
pthread_create(&threads[i], NULL, sell_tickets, NULL);
} else { // 奇数线程为退票员
pthread_create(&threads[i], NULL, refund_tickets, NULL);
}
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("Total tickets sold: %d\n", num_tickets_sold);
printf("Total tickets refunded: %d\n", num_tickets_refunded);
printf("Remaining seats: %d\n", num_seats_available);
return 0;
}
```