- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统课程设计实现生产者消费者问题精品
《操作系统》课程设计
实现生产者消费者问题
一、课程设计的性质与任务在多进程(线程)运行环境中,进程(线程)之间并发执行,如果对进程(线程)访问临界资源(如公共变量)的操作不加限制,就会产生“与时间有关”的错误。为防止这类错误,必须用同步机构控制进程(线程)对临界资源(公共变量)的访问。本实验利用Windows系统提供的同步机制,来协调线程(Thread)间的并发执行,以加深对同步机制的理解,并学会在并发程序中引用同步机构的编程方法。 二、课程设计的内容及其要求
三、课程设计的 四、
SIGNAL原语的操作主要动作是:
sem加1;
若相加结果大于零,进程继续执行;
若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
SIGNAL原语的功能框图如图:
2、数据结构及信号量定义的说明;
创建信号量 g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
//四个参数分别为:表示是否允许继承、
//设置信号机的初始计数、设置信号机的
//最大计数、指定信号机对象的名称(-1是因为计数从0开始)
(3)创建缓冲区空的信号量
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
ReleaseSemaphore(hSemaphore, 1, NULL);
3、实验源程序关键算法;
//为每一个生产者创建生产者线程
for(int i=0;iPRODUCERS_COUNT;++i){
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,producerID[i]);
if (hThreads[i]==NULL) return -1;
}
//为每一个消费者创建消费者线程
for(int j=0;jCONSUMERS_COUNT;++j){
hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,consumerID[j]);
if (hThreads[j]==NULL) return -1;
}
while(g_continue){
if(getchar()){ //按回车后终止程序运行
g_continue = false;
}
}
return 0;
}
//生产一个产品。简单模拟了一下,仅输出新产品的ID号
void Produce()
{
cerr -------------------------------------------------------------------\n;
cerr 生产一个产品 编号为: ++ProductID ... endl;
}
//把新生产的产品放入缓冲区
void Append()
{
cerr \n把新生产的产品放入缓冲区 ... \n;
g_buffer[in] = ProductID;
in = (in+1)%SIZE_OF_BUFFER; //把下一个生产的产品放入下一个缓冲区
//输出缓冲区当前的状态
cout \n显示缓冲区当前的状态:\n\n;
cout \n缓冲区编号产品编号\n;
for (int i=0;iSIZE_OF_BUFFER;++i){
cout 缓冲区 i : g_buffer[i];
文档评论(0)