信号量实验项目: 桌子上有一个能盛得下5个水果的空盘子,爸爸不停地向盘子中放入苹果或者桔子,儿子不停地从盘子中取出桔子享用,女儿不停的从盘子中取出苹果享用。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿三个进程间的同步。(网上题目看看效果先) 要求: 1、写出相应算法及相关说明。 2、必须用程序设计语言实现整个循环进程的模拟。(设计语言不限) 3、对模拟效果进行截图,提交完整的实验报告。 4、在学习通中上传Word 版实验报告附件。
时间: 2023-05-21 20:07:05 浏览: 285
这是一个编程类的问题,可以回答。
这是一个经典的生产者消费者问题,可以使用信号量进行同步。
算法如下:
1. 定义一个共享缓冲区(盘子)和两个信号量(semaphore)empty和full。
2. empty表示未放置的苹果或者桔子的数量,full表示已经放置的水果的数量。
3. 父进程放苹果或者桔子,如果盘子满了(empty==0),则等待full信号量。如果盘子未满(empty>0),则放置水果到盘子中,empty减1,然后释放full信号量。
4. 儿子和女儿进程从盘子中取水果,如果盘子为空(full==0),则等待empty信号量。如果盘子不为空(full>0),则从盘子中取出一个水果,full减1,然后释放empty信号量。
下面是示例代码(java语言),截图和实验报告请自行设计。
```java
import java.util.concurrent.Semaphore;
public class FruitBowl {
private static Semaphore empty = new Semaphore(5);
private static Semaphore full = new Semaphore(0);
private static Object lock = new Object();
private static int fruits = 0;
public static void main(String[] args) {
Thread father = new Thread(new Father());
Thread son = new Thread(new Son());
Thread daughter = new Thread(new Daughter());
father.start();
son.start();
daughter.start();
}
static class Father implements Runnable {
@Override
public void run() {
while (true) {
produceFruit();
}
}
private void produceFruit() {
try {
empty.acquire();
synchronized (lock) {
if (fruits < 5) {
fruits++;
System.out.println("Father put a fruit(" + fruits + ") in the bowl");
}
full.release();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Son implements Runnable {
@Override
public void run() {
while (true) {
consumeOrange();
}
}
private void consumeOrange() {
try {
full.acquire();
synchronized (lock) {
if (fruits > 0) {
fruits--;
System.out.println("Son took an orange(" + fruits + ") from the bowl");
}
empty.release();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Daughter implements Runnable {
@Override
public void run() {
while (true) {
consumeApple();
}
}
private void consumeApple() {
try {
full.acquire();
synchronized (lock) {
if (fruits > 0) {
fruits--;
System.out.println("Daughter took an apple(" + fruits + ") from the bowl");
}
empty.release();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
阅读全文