请编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。
时间: 2023-06-15 07:06:49 浏览: 35
下面是一个基于Python的程序实现:
```python
import threading
import time
import random
# 票的总数
TICKET_NUM = 1000
# 定义一个数组,表示每张票是否售出
ticket_sold = [False] * TICKET_NUM
# 定义一个锁,用于保证同一时刻只有一个线程能够修改ticket_sold数组
ticket_sold_lock = threading.Lock()
# 模拟售票窗口
def sell_tickets(window_id):
while True:
# 随机休眠一段时间
time.sleep(random.random())
# 随机售出1-10张车票
num_tickets = random.randint(1, 10)
# 依次售出每张车票
for i in range(num_tickets):
# 随机选择一张未售出的车票
ticket_id = random.randint(0, TICKET_NUM-1)
while True:
# 获取锁
ticket_sold_lock.acquire()
if not ticket_sold[ticket_id]:
# 如果该车票未售出,则将其售出
ticket_sold[ticket_id] = True
# 释放锁
ticket_sold_lock.release()
print("窗口%d售出了第%d张车票" % (window_id+1, ticket_id+1))
break
else:
# 如果该车票已售出,则释放锁,重新选择车票
ticket_sold_lock.release()
ticket_id = random.randint(0, TICKET_NUM-1)
# 判断是否售完所有车票
if all(ticket_sold):
break
# 创建10个售票窗口线程
threads = []
for i in range(10):
t = threading.Thread(target=sell_tickets, args=(i,))
threads.append(t)
# 启动所有线程
for t in threads:
t.start()
# 等待所有线程执行完毕
for t in threads:
t.join()
print("所有车票已售完")
```
该程序的主要思路是,定义一个包含所有车票售出状态的数组ticket_sold,初始时所有车票都未售出。每个售票窗口线程会随机休眠一段时间,然后随机售出1-10张车票。对于每一张车票,线程会随机选择一张未售出的车票,然后使用ticket_sold_lock锁保证同一时刻只有一个线程能够修改ticket_sold数组。如果该车票未售出,则将其售出,并打印出售票信息。如果该车票已售出,则释放锁,重新选择车票。当所有车票都售出后,程序结束。