中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 未整理篇
生产者-消费者问题
作者:babyrockxray 时间:2003-02-09 11:08 出处:互联网 责编:chinaitpower
              摘要:生产者-消费者问题

     在学习进程互斥中,有个著名的问题:生产者-消费者问题。这个问题是一个标准的、著

名的同时性编程问题的集合:一个有限缓冲区和两类线程,它们是生产者和消费者,生产者

把产品放入缓冲区,相反消费者便是从缓冲区中拿走产品。
 
     生产者在缓冲区满时必须等待,直到缓冲区有空间才继续生产。消费者在缓冲区空时必

须等待,直到缓冲区中有产品才能继续读取。
 
     在这个问题上主要考虑的是:缓冲区满或缓冲区空以及竞争条件(race condition)。以下

是一个含竞争条件的生产者-消费者问题实例。

  #define N 100            /*number of slots in the buffer*/
   int count=0;               /*number of items in the buffer*/
   void producer(void) {
          int item;
          while(TRUE) {
              produce_item(&item);
              if (count==N) sleep();
               enter_item(item);
                count=count+1;
               if (count==1) wakeup(consumer);
           }
  }
   void comsumer(void) {
           int item;
           while(TRUE) {
                if(count==0) sleep();
                remove_item(&item);
                count=count-1;
                if (count==N-1) wakeup(producer);
                consume_item(item);
           }
   }

   在这个实例中,首先定义了一个大小为100的公共缓冲区,也就是临界资源,然后的count

便是缓冲区中产品的数目,初始化为0。producer函数是生产者函数,produce_item(&item

);是指生产者生产出来一个产品,但是这时候并没有对缓冲区进行操作。而if (count==N)

sleep();是测试语句,如果生产出来的产品数和缓冲区大小相等时,生产者就进入睡眠状态

。如果不等,产品就放入缓冲区内,并且产品数增加1。if (count==1) wakeup(consumer);

这条语句看上去让人十分费解,其实它的意思是,如果上一次操作时产品的数目为0,消费

者已经进入了睡眠状态,而现在生产者又生产出来一个产品,缓冲区内不为空,这时把消费

者唤醒。消费者函数也是同样的道理,只不过一个是取,另一个是放。

    我们可以看到,这里存在潜在的竞争条件,所谓竞争条件就是这样一种情况:多个线程对

数据产生的作用要依赖于线程的调度顺序的。当两个线程竞相访问同一数据时,就会发生竞

争条件。由于时间片的原因,一个线程可以在任意一个时刻打断其他线程,因此数据可能会

被破坏或者被错误地解释。在这个实例上反应的结果是,生产者和消费者两个进程都永远睡

眠。至于有哪些解决方案,以后再慢慢讨论。 


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有