模拟ATM取钱系统,取款机里一共有10000元,有五个人(五个线程)分别去取钱,每次取钱的金额在100元到500元之间, # 要求输出他们每次取钱的金额,以及ATM机里的余额,当取钱数大于余额时,提示余额不足,让别的人继续取钱,当余额小于100时,退出系统。 # 用多线程 上锁
时间: 2024-03-17 07:39:57 浏览: 12
好的,这是一个经典的多线程同步问题。我们可以使用Python的threading模块来实现多线程,并使用锁来避免多个线程同时修改ATM机里的余额。下面是一个可能的解决方案:
```python
import threading
import time
import random
total_money = 10000
lock = threading.Lock()
class WithdrawThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
while True:
# 随机生成取款金额
money = random.randint(100, 500)
lock.acquire()
# 判断余额是否充足
if total_money >= money:
total_money -= money
print("{} withdraws {} yuan. Remaining balance: {} yuan.".format(self.name, money, total_money))
# 模拟取款过程需要时间
time.sleep(1)
else:
print("{} wants to withdraw {} yuan, but remaining balance is {} yuan. Withdrawal failed.".format(self.name, money, total_money))
lock.release()
# 如果余额小于100,退出系统
if total_money < 100:
print("ATM machine is out of money. Exiting...")
break
# 创建五个线程
threads = []
for i in range(5):
t = WithdrawThread("Thread {}".format(i+1))
threads.append(t)
# 启动所有线程
for t in threads:
t.start()
# 等待所有线程结束
for t in threads:
t.join()
```
在这个程序中,我们创建了一个`WithdrawThread`类来表示每个取款线程,`run`方法里面是取款的具体实现。在每次取款前,我们使用`lock.acquire()`来获取锁,避免多个线程同时修改余额。如果余额充足,则进行取款操作,并输出取款金额和余额;否则输出取款失败的信息。取款过程需要1秒钟的时间,使用`time.sleep(1)`来模拟。在每次取款后,我们使用`lock.release()`来释放锁,让其他线程可以继续执行。
最后,我们创建了五个线程,并启动它们。程序会等待所有线程结束后才退出。在这个程序中,我们使用了`total_money`和`lock`两个全局变量来表示ATM机里的余额和锁。这种方式虽然简单,但并不是最优的实现方式。在实际生产环境中,我们应该使用更加健壮和高效的多线程同步方式来避免竞争条件和死锁等问题。