2.三个进程P1、P2、P3使用包含N个单元的缓冲区,P1每次用Produce()生成一个正整数并用put()送入缓冲区的某个空单元;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从缓冲区中取出偶数并用counteven()统计偶数个数,请用信号量实现三个进程的同步与互斥活动。
时间: 2024-03-16 18:41:50 浏览: 12
这道题可以使用两个信号量来实现进程间的同步和互斥。分别是empty和full信号量。
- empty表示缓冲区中空的单元数量,初始值为N。
- full表示缓冲区中已有数据的单元数量,初始值为0。
另外,我们还需要一个mutex信号量用于保护缓冲区的互斥访问。
下面是一个可能的解决方案:
```
#define N 100 //缓冲区大小
int buffer[N]; //缓冲区
int in = 0, out = 0; //缓冲区的写入和读取指针
Semaphore empty(N), full(0), mutex(1); //信号量
void Produce(int item) {
empty.P(); //等待空单元
mutex.P(); //获取互斥访问权
buffer[in] = item; //将数据写入缓冲区
in = (in + 1) % N; //更新写入指针
mutex.V(); //释放互斥访问权
full.V(); //通知已有数据的单元数量+1
}
int getodd() {
int item;
full.P(); //等待有奇数
mutex.P(); //获取互斥访问权
int i = out;
while (buffer[i] % 2 == 0) { //查找奇数
i = (i + 1) % N;
}
item = buffer[i]; //取出奇数
out = (i + 1) % N; //更新读取指针
mutex.V(); //释放互斥访问权
empty.V(); //通知空单元数量+1
return item;
}
int geteven() {
int item;
full.P(); //等待有偶数
mutex.P(); //获取互斥访问权
int i = out;
while (buffer[i] % 2 == 1) { //查找偶数
i = (i + 1) % N;
}
item = buffer[i]; //取出偶数
out = (i + 1) % N; //更新读取指针
mutex.V(); //释放互斥访问权
empty.V(); //通知空单元数量+1
return item;
}
int countodd() {
int count = 0;
mutex.P(); //获取互斥访问权
int i = out;
for (int j = 0; j < full.value(); j++) { //遍历已有数据的单元
if (buffer[i] % 2 == 1) { //统计奇数个数
count++;
}
i = (i + 1) % N;
}
mutex.V(); //释放互斥访问权
return count;
}
int counteven() {
int count = 0;
mutex.P(); //获取互斥访问权
int i = out;
for (int j = 0; j < full.value(); j++) { //遍历已有数据的单元
if (buffer[i] % 2 == 0) { //统计偶数个数
count++;
}
i = (i + 1) % N;
}
mutex.V(); //释放互斥访问权
return count;
}
```
在Produce函数中,首先等待有空单元,然后获取互斥访问权,将数据写入缓冲区,更新写入指针,释放互斥访问权,最后通知已有数据的单元数量+1。
在getodd和geteven函数中,首先等待有奇数或偶数,然后获取互斥访问权,查找奇数或偶数,取出数据,更新读取指针,释放互斥访问权,最后通知空单元数量+1。
在countodd和counteven函数中,首先获取互斥访问权,遍历已有数据的单元,统计奇数或偶数个数,释放互斥访问权。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)