编写程序,模拟pv操作,实现题目:桌上有一只盘子,只可容纳n(0<n<5)个零食,每次只能放入或取出1个零食。爸爸向盘中放巧克力或者薯片或糖果;女儿1专等吃盘子中的糖果,女儿2专等吃盘子中的薯片,女儿3专等吃盘子中的巧克力。请用信号量和P、V操作来协调爸爸、女儿1、女儿2、女儿3之间的同步与互斥关系
时间: 2024-03-11 10:49:02 浏览: 35
下面是使用Python实现的代码:
```python
import threading
import time
class Plate:
def __init__(self, n):
self.n = n
self.snacks = []
self.mutex = threading.Semaphore(1)
self.empty = threading.Semaphore(n)
self.full = threading.Semaphore(0)
self.daughters = [threading.Semaphore(0) for i in range(3)]
def put_snack(self, snack):
self.empty.acquire()
self.mutex.acquire()
self.snacks.append(snack)
print(f"爸爸放了一个{snack}到盘子里")
self.mutex.release()
self.full.release()
def get_snack(self, daughter_id, desired_snack):
self.daughters[daughter_id].acquire()
self.mutex.acquire()
if desired_snack in self.snacks:
self.snacks.remove(desired_snack)
print(f"女儿{daughter_id+1}拿到了一个{desired_snack}")
else:
print(f"女儿{daughter_id+1}没能拿到想要的{desired_snack}")
self.mutex.release()
self.empty.release()
def father(plate):
while True:
random_snack = "巧克力" if time.time() % 3 == 0 else "薯片" if time.time() % 3 == 1 else "糖果"
plate.put_snack(random_snack)
time.sleep(1)
def daughter(plate, daughter_id, desired_snack):
while True:
plate.get_snack(daughter_id, desired_snack)
time.sleep(1)
plate = Plate(3)
f = threading.Thread(target=father, args=(plate,))
d1 = threading.Thread(target=daughter, args=(plate, 0, "糖果"))
d2 = threading.Thread(target=daughter, args=(plate, 1, "薯片"))
d3 = threading.Thread(target=daughter, args=(plate, 2, "巧克力"))
f.start()
d1.start()
d2.start()
d3.start()
f.join()
d1.join()
d2.join()
d3.join()
```
这里我们定义了一个`Plate`类来表示盘子,其中包含了一个列表`snacks`来存储零食、信号量`mutex`来实现互斥、信号量`empty`来表示盘子空位、信号量`full`来表示盘子已满、以及一个长度为3的信号量列表`daughters`,分别用于控制女儿1、2、3的拿零食操作。
`father`函数代表爸爸的操作,每隔1秒钟往盘子里放入一个随机的零食。
`daughter`函数代表女儿的操作,每隔1秒钟尝试从盘子中拿出一个特定的零食,如果拿到了就输出提示信息,否则也输出提示信息。
在主程序中创建了一个`Plate`对象和4个线程对象(爸爸和3个女儿),启动这些线程后等待它们结束即可。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)