编程模拟实现飞机售票: 创建多个售票线程; 已售票使用公用全局变量; 创建互斥信号灯; 对售票线程临界区施加P、V操作,售票线程打印售票信息; 主进程等待子线程退出,各线程在票卖完时打印售票总数、退出。
时间: 2024-05-06 11:16:34 浏览: 45
飞机票模拟程序
以下是一个简单的飞机售票的模拟实现:
```python
import threading
# 全局变量
sold_tickets = 0
total_tickets = 100
lock = threading.Lock()
# 定义售票函数
def sell_tickets():
global sold_tickets
global total_tickets
while True:
# 上锁
lock.acquire()
if total_tickets > 0:
# 还有票可售
sold_tickets += 1
total_tickets -= 1
print("售票线程%s售出第%s张票,剩余票数%s" % (threading.current_thread().name, sold_tickets, total_tickets))
else:
# 没有票可售
print("售票线程%s售票结束,共售出%s张票" % (threading.current_thread().name, sold_tickets))
# 释放锁
lock.release()
break
# 释放锁
lock.release()
# 创建售票线程
threads = []
for i in range(5):
t = threading.Thread(target=sell_tickets, name="Thread-%s" % (i+1))
threads.append(t)
# 启动售票线程
for t in threads:
t.start()
# 等待售票线程结束
for t in threads:
t.join()
# 打印售票总数
print("所有售票线程结束,共售出%s张票" % sold_tickets)
```
在这个模拟实现中,我们首先定义了全局变量 `sold_tickets` 和 `total_tickets`,分别表示已售票数和总票数。我们使用了 `threading.Lock()` 创建了一个互斥锁 `lock`,在售票函数中使用 `lock.acquire()` 上锁,在操作全局变量时使用 `lock.release()` 释放锁,确保多个线程同时访问全局变量时的线程安全。
接着,我们创建了 5 个售票线程,并启动了这些线程。每个售票线程都会不断地尝试售出一张票,直到所有票都售完为止。在售票线程结束后,我们使用 `thread.join()` 等待线程结束,并打印售票总数。
当然,这只是一个简单的模拟实现,实际的飞机售票系统要考虑更多的因素,例如如何处理多个用户同时购买同一张票等问题。
阅读全文