操作系统中生产者和消费者问题,求解
#include<iostream>#include<vector>
using namespace std;
//定义缓冲区大小
#define MAX_SIZE 20
int Buffer[MAX_SIZE];
//全局变量
int in,out;
int Sin = MAX_SIZE;
int Sout = 0;
int mutex = 1;
void P( int &i ); //P操作
void V( int &i ); //V操作
void display(); //显示缓冲区内容
class Producer
{
public:
Producer( int &value );
int load_value(); //向缓冲区内输入元素
int return_value() { return x; }
private:
static int n;
int x;
static vector<Producer> pro; //模拟生产者的阻塞队列
};vector<Producer> Producer::pro;
Producer ::Producer( int &value )
{
x = value;
}
int Producer::load_value()
{
if( Sin > 0 )
{
P(Sin);
if( mutex == 1 && pro.size() == 0 ) //信号量为1并且阻塞队列里没有等待的进程时,运行当前进程
{
P(mutex);
Buffer[in] = x;
in = (in+1) % MAX_SIZE;
V(mutex);
V(Sout);
}
else if( pro.size() != 0 ) //信号量为1且阻塞队列里有等待的进程时,先执行阻塞队列的第一个进程,并且把当前进程添加到阻塞 //队列
{ //队列,执行完成后删除第一个已执行的进程
pro.push_back(*this);
int i = pro[0].return_value();
P(mutex);
Buffer[in] = i;
in = (in+1) % MAX_SIZE;
V(mutex);
V(Sout);
pro.erase( pro.begin() );
}
else //信号量为0时,将该进程添加到阻塞队列
pro.push_back(*this);
return 0;
}
}
class Consumer
{
public:
int get_value(int &x); //取出缓冲区的数据,成功返回0,并将取出的数据放入x,失败返回-1
private:
int x;
static vector<Consumer> con;
};vector<Consumer> Consumer::con;
int Consumer::get_value( int &x )
{
if( Sout > 0 )
{
P(Sout);
if( mutex == 1 && con.size() == 0 )
{
P(mutex);
x = Buffer[out];
out = (out+1) % MAX_SIZE;
V(mutex);
V(Sin);
}
else if( con.size() != 0 )
{
P(mutex);
con[0].x = Buffer[out];
out = (out+1) % MAX_SIZE;
V(mutex);
V(Sin);
}
else
con.push_back( *this );
}
return 0;
}
int main()
{
int i,j;
Producer p( i=3 ),p1( i=5 );
p.load_value();
p1.load_value();
display();
Consumer c,c1;
c.get_value(j);
cout << "取出的数据为: " << j << endl;
c1.get_value(j);
cout << "取出的数据为: " << j << endl;
display();
getchar();getchar();
return 0;
}
void P(int &i )
{
i = i-1;
}
void V(int &i )
{
i = i+1;
}
void display()
{
cout << "缓冲区数据为: ";
for( int i = 0; i < Sout; i++ )
cout << Buffer[i] << " ";
cout << "空闲缓冲区为: " << Sin << " 个" << endl;
}
这里我想问下如何来模拟多进程呢,就比如一个生产者正在运行的,而另一个生产者或消费者也要运行,但是生产者还没运行完,只能将自己挂起
相关推荐
CISP-CSE注册云安全工程师备考资源包基础教程
随着云计算技术的普及,云安全已成为网络安全领域的核心议题。CISP-CSE(注册云安全工程师)认证由中国信息安全测评中心颁发,旨在培养具备云安全专业知识和实践能力的实战型人才。本教程将结合"CISP-CSE注册云安全工程师备考资源包",系统性地为您梳理云安全的核心知识体系,并提供实战案例分析,助您高效备考。
绘图模拟:在冲动环境中固定时间的示例 附matlab代码.rar
绘图模拟:在冲动环境中固定时间的示例 附matlab代码.rar
基于规则的电动汽车混合能源管理系统,采用MATLAB、Simulink、Simscape Electrical和Stateflow。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)
内容概要:本文围绕虚拟同步发电机(VSG)的自适应惯量阻尼控制展开深入研究,通过Simulink搭建详细的系统仿真模型,并结合Matlab代码实现控制算法,系统分析了根轨迹特性及不同调节系数对系统动态响应的影响。研究重点在于设计并验证一种能够根据电网频率变化自动调整惯量和阻尼参数的自适应控制策略,有效提升了VSG在面对负载突变或新能源波动时的频率稳定性与抗干扰能力,为高比例可再生能源接入下的电力系统稳定运行提供了关键技术支撑。; 适合人群:具备电力系统分析、自动控制理论及新能源并网技术基础的研究生、科研人员以及从事微电网、分布式能源系统设计与运维的工程技术人员。; 使用场景及目标:①深入理解虚拟同步发电机的工作原理及其在提升电网惯性方面的关键作用;②掌握基于Simulink的电力电子与控制系统建模与仿真方法;③学习并实践惯量和阻尼自适应控制策略的设计流程,通过根轨迹分析手段优化控制器参数,提升系统动态性能。; 阅读建议:建议读者结合所提供的Simulink仿真模型与Matlab代码进行同步操作,重点关注控制器设计逻辑与参数整定过程,通过改变调节系数观察系统响应变化,深化对稳定性判据与控制性能之间关系的理解。
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)内容概要:本文主要介绍了数字下变频(DDC)技术在雷达信号处理中的应用,并提供了基于Matlab的代码实现。DDC作为现代雷达系统中的关键环节,主要用于将高频接收信号转换为便于后续处理的低频或基带信号,从而提高信号处理效率与精度。文中详细阐述了DDC的基本原理,包括混频、低通滤波和抽取等步骤,并通过Matlab代码展示了其实现过程,帮助读者理解如何在实际工程中构建和调试DDC模块。此外,文档还提及该资源属于一个涵盖多个科研方向的技术资料集合,如路径规划、电力系统优化、机器学习、通信系统仿真等,强调借助成熟工具与方法可提升科研效率。 适合人群:具备一定信号处理基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适用于从事雷达系统设计、通信工程或相关领域研究的人员。 使用场景及目标:① 学习和掌握数字下变频(DDC)在雷达信号处理中的基本原理与实现方法;② 利用Matlab进行算法仿真与验证,辅助完成课程设计、毕业课题或科研项目中的信号处理部分;③ 借助提供的代码框架拓展至其他通信或雷达系统仿真任务中。 阅读建议:此资源以Matlab代码为核心载体,注重理论与实践结合,建议读者在学习过程中同步运行代码并调整参数,观察不同设置对下变频结果的影响,加深对混频泄漏、滤波器设计和采样率变化等问题的理解,从而真正掌握DDC的关键技术细节。


