某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票,并保证线程同步,不会出现错误的买票数据。
时间: 2024-04-09 16:27:52 浏览: 6
以下是一个简单的示例程序,使用线程同步(互斥锁)来模拟电影院卖票的过程:
```python
import threading
class Ticket:
def __init__(self, total):
self.total = total
self.lock = threading.Lock()
def sell(self):
self.lock.acquire()
if self.total > 0:
print(f"售票窗口{threading.current_thread().name}卖出一张票,剩余{self.total-1}张票")
self.total -= 1
else:
print("票已售完")
self.lock.release()
def sell_tickets(ticket):
while ticket.total > 0:
ticket.sell()
if __name__ == "__main__":
ticket = Ticket(100)
threads = []
for i in range(3):
thread = threading.Thread(target=sell_tickets, args=(ticket,), name=f"窗口{i+1}")
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
```
在这个例子中,我们创建了一个`Ticket`类来管理电影院的票数。`Ticket`类拥有一个总票数的属性`total`,以及一个互斥锁`lock`用于线程同步。`sell()`方法用于卖票,其中使用`lock.acquire()`获取锁,确保在同一时刻只有一个线程能执行卖票操作,然后根据剩余票数进行售票或者显示票已售完的信息,最后使用`lock.release()`释放锁。
在主程序中,我们创建了3个线程模拟3个售票窗口,每个窗口不断地调用`sell_tickets()`函数进行售票,直到票已售完。使用`threading.Thread`创建线程,并使用`start()`方法启动线程。最后使用`join()`方法等待所有线程执行完毕。
通过互斥锁的使用,确保了线程同步,避免了错误的买票数据。