wsl编程模拟实现飞机售票: 创建多个售票线程; 已售票使用公用全局变量; 创建互斥信号灯; 对售票线程临界区施加P、V操作,售票线程打印售票信息; 主进程等待子线程退出,各线程在票卖完时打印售票总数、退出。
时间: 2024-05-09 10:16:45 浏览: 5
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define SEATS 100 // 定义飞机的座位数
int tickets = SEATS; // 初始化剩余票数
pthread_mutex_t mutex; // 定义互斥信号灯
// 售票线程函数
void *sell_tickets(void *arg) {
int sold = 0; // 已售票数
while (1) {
pthread_mutex_lock(&mutex); // 进入临界区
if (tickets > 0) { // 判断是否还有票
sold++;
tickets--;
printf("Thread %ld sold one ticket, %d tickets left.\n", pthread_self(), tickets);
}
else {
pthread_mutex_unlock(&mutex); // 退出临界区
break;
}
pthread_mutex_unlock(&mutex); // 退出临界区
}
printf("Thread %ld sold %d tickets.\n", pthread_self(), sold);
pthread_exit(NULL);
}
int main() {
pthread_t threads[10]; // 定义10个售票线程
pthread_mutex_init(&mutex, NULL); // 初始化互斥信号灯
int i;
for (i = 0; i < 10; i++) {
pthread_create(&threads[i], NULL, sell_tickets, NULL); // 创建售票线程
}
for (i = 0; i < 10; i++) {
pthread_join(threads[i], NULL); // 主进程等待子线程退出
}
printf("All tickets sold out, total sold: %d.\n", SEATS - tickets); // 打印售票总数
pthread_mutex_destroy(&mutex); // 销毁互斥信号灯
return 0;
}
```
在这个程序中,我们使用了 `pthread_mutex_t` 类型的变量 `mutex` 来实现临界区的互斥访问。
在售票线程函数中,我们首先使用 `pthread_mutex_lock()` 函数进入临界区,判断是否还有票,如果还有,则售出一张票,更新剩余票数并打印信息;如果已经售完,则使用 `pthread_mutex_unlock()` 函数退出临界区并结束售票线程。
在主函数中,我们创建了10个售票线程,并使用 `pthread_join()` 函数等待这些子线程退出。最后再打印售票总数并销毁互斥信号灯。