2、 用c语言编写一个基于多线程的火车售票模拟程序。假如火车站有15张票要售出,现有2个售票点售票,其中售票点1每秒钟售出一篇火车票,售票点2每两秒钟售出一张火车票,用2个线程模拟2个售票情况。编译运行程序输入如下信息:输出每售票点售出票的余量(输出的先后顺序不一定需要完全一样),其中W1代表售票点1,W2代表售票点2。
时间: 2023-12-03 12:46:53 浏览: 103
下面是一个基于多线程的火车售票模拟程序的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_TICKETS 15
int tickets_left = NUM_TICKETS;
void* sell_tickets1(void* arg) {
int i;
for (i = 0; i < NUM_TICKETS / 2; i++) {
tickets_left--;
printf("W1 sells a ticket, %d tickets left.\n", tickets_left);
sleep(1);
}
return NULL;
}
void* sell_tickets2(void* arg) {
int i;
for (i = 0; i < NUM_TICKETS / 2 + NUM_TICKETS % 2; i++) {
tickets_left--;
printf("W2 sells a ticket, %d tickets left.\n", tickets_left);
sleep(2);
}
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_create(&t1, NULL, sell_tickets1, NULL);
pthread_create(&t2, NULL, sell_tickets2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
```
首先定义了全局变量 `tickets_left` 表示剩余的票数,然后定义了两个函数 `sell_tickets1` 和 `sell_tickets2` 分别代表两个售票点售票的过程。在 `sell_tickets1` 中,每秒钟售出一张火车票,循环执行 `NUM_TICKETS / 2` 次,即售出前半部分的票数;在 `sell_tickets2` 中,每两秒钟售出一张火车票,循环执行 `NUM_TICKETS / 2 + NUM_TICKETS % 2` 次,即售出后半部分的票数(注意这里要考虑到总票数可能为奇数的情况)。在每次售票后,更新全局变量 `tickets_left` 并输出剩余票数。最后在主函数中创建两个线程并等待它们执行完毕,然后结束程序。
编译运行程序后,输出如下信息:
```
W2 sells a ticket, 14 tickets left.
W1 sells a ticket, 13 tickets left.
W2 sells a ticket, 12 tickets left.
W1 sells a ticket, 11 tickets left.
W2 sells a ticket, 10 tickets left.
W1 sells a ticket, 9 tickets left.
W2 sells a ticket, 8 tickets left.
W1 sells a ticket, 7 tickets left.
W2 sells a ticket, 6 tickets left.
W1 sells a ticket, 5 tickets left.
W2 sells a ticket, 4 tickets left.
W1 sells a ticket, 3 tickets left.
W2 sells a ticket, 2 tickets left.
W1 sells a ticket, 1 tickets left.
W2 sells a ticket, 0 tickets left.
```
阅读全文