请编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。 提示:可设定程序中按顺序售卖车票;请使用同步机制确保程序运行正确。
时间: 2023-06-16 20:05:52 浏览: 75
以下是使用Python编写的程序实现上述需求:
```python
import threading
import time
import random
# 票池,存储所有的车票编号
ticket_pool = set(range(1, 1001))
# 创建锁对象
lock = threading.Lock()
# 定义售票窗口类
class TicketWindow(threading.Thread):
def run(self):
while True:
# 加锁
lock.acquire()
# 判断是否还有车票
if len(ticket_pool) > 0:
# 随机选择一张车票
ticket = random.sample(ticket_pool, 1)[0]
# 从票池中移除该车票
ticket_pool.remove(ticket)
# 释放锁
lock.release()
# 随机休眠一段时间,模拟售票过程
time.sleep(random.randint(1, 3))
# 输出售票信息
print(f"{self.name}售出车票:{ticket}")
else:
# 释放锁并退出循环
lock.release()
break
# 创建10个售票窗口
for i in range(1, 11):
TicketWindow(name=f"窗口{i}").start()
```
程序中首先定义了一个票池 `ticket_pool` 存储所有的车票编号,然后创建了一个锁对象 `lock` 用于同步访问票池,接着定义了售票窗口类 `TicketWindow`,在该类的 `run` 方法中实现了售票过程,首先使用锁对象加锁,然后判断票池中是否还有车票,如果有,则随机选择一张车票进行售票,并从票池中移除该车票,然后释放锁并随机休眠一段时间模拟售票过程,最后输出售票信息。如果票池中没有车票,则释放锁并退出循环。最后创建10个售票窗口并启动它们。程序运行结束时,所有车票都应该已经售出。
阅读全文