请编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。
时间: 2023-06-17 11:04:21 浏览: 143
以下是Python实现的代码:
```python
import threading
import random
# 火车票总数
TICKET_TOTAL = 1000
# 票池
ticket_pool = [i for i in range(1, TICKET_TOTAL+1)]
# 创建锁
lock = threading.Lock()
# 定义售票窗口函数
def sell_ticket(window_name):
while True:
# 随机休眠一段时间
time_to_sleep = random.randint(1, 5)
print(f"{window_name}休眠{time_to_sleep}秒")
time.sleep(time_to_sleep)
# 随机售出1~10张车票
num_to_sell = random.randint(1, 10)
sold_tickets = []
for i in range(num_to_sell):
lock.acquire() # 获取锁
if ticket_pool:
# 随机选择一张车票
ticket_index = random.randint(0, len(ticket_pool)-1)
ticket_id = ticket_pool.pop(ticket_index)
print(f"{window_name}售出车票:{ticket_id}")
sold_tickets.append(ticket_id)
lock.release() # 释放锁
# 如果售票员已经售出所有车票,则退出循环
if not ticket_pool:
print(f"{window_name}已售罄")
break
# 创建10个售票窗口线程
threads = []
for i in range(1, 11):
window_name = f"售票窗口{i}"
t = threading.Thread(target=sell_ticket, args=(window_name,))
threads.append(t)
# 启动线程
for t in threads:
t.start()
# 等待所有线程结束
for t in threads:
t.join()
print("所有车票已售罄")
```
在程序中,我们先定义了一个长度为1000的票池,里面存放了所有的车票编号。然后创建了10个售票窗口线程,每个售票窗口线程随机休眠一段时间后售出随机数量的车票。售票窗口线程的核心代码如下:
```python
# 随机休眠一段时间
time_to_sleep = random.randint(1, 5)
print(f"{window_name}休眠{time_to_sleep}秒")
time.sleep(time_to_sleep)
# 随机售出1~10张车票
num_to_sell = random.randint(1, 10)
sold_tickets = []
for i in range(num_to_sell):
lock.acquire() # 获取锁
if ticket_pool:
# 随机选择一张车票
ticket_index = random.randint(0, len(ticket_pool)-1)
ticket_id = ticket_pool.pop(ticket_index)
print(f"{window_name}售出车票:{ticket_id}")
sold_tickets.append(ticket_id)
lock.release() # 释放锁
```
在售票过程中,我们通过获取锁来确保同一张车票只能售出一次。如果售票员已经售出了所有的车票,则退出循环,程序结束。
阅读全文