操作系统课程实现生产者消费者问题.docVIP

  • 16
  • 0
  • 约1.06万字
  • 约 14页
  • 2018-06-03 发布于湖北
  • 举报

操作系统课程实现生产者消费者问题.doc

操作系统课程实现生产者消费者问题

《操作系统》课程设计 实现生产者消费者问题 一、课程设计的性质与任务在多进程(线程)运行环境中,进程(线程)之间并发执行,如果对进程(线程)访问临界资源(如公共变量)的操作不加限制,就会产生“与时间有关”的错误。为防止这类错误,必须用同步机构控制进程(线程)对临界资源(公共变量)的访问。 本实验利用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)

1亿VIP精品文档

相关文档