生产者-消费者问题

原创 2004年10月30日 02:04:00

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

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

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

须等待,直到缓冲区中有产品才能继续读取。
 
     在这个问题上主要考虑的是:缓冲区满或缓冲区空以及竞争条件(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,消费

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

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

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

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

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

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

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

关于生产者-消费者问题

 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一...
  • orientalcherry
  • orientalcherry
  • 2008年08月22日 15:30
  • 22110

操作系统:生产者消费者问题

问题描述: 单个生产者,多个消费者,多个缓冲池,利用多线程通过同步互斥原则完成数据的读取。 解决方案: 生产者与消费者之间涉及同步问题,当缓冲池中有数据时,消费者才能去读取数据;当缓冲池有空余位置时,...
  • qq_27704269
  • qq_27704269
  • 2016年06月06日 12:16
  • 3688

进程间通信之信号量--使用信号实现生产者消费者问题

生产者消费者是数学中的一个经典的问题,也是编程中的一个经典问题。 本示例采用信号量来解决这个问题,其实,最终也就是进程之间同步的问题。 生产者源代码如下: #include #include...
  • ssdsafsdsd
  • ssdsafsdsd
  • 2012年11月20日 18:51
  • 2678

Java中简单的生产者和消费者问题

生产者和消费者问题描述:   仓库初始值为0, 生产者首先生产产品,生产产品后将产品放入仓库,仓库中产品数量变为1, 此时生产者不在生产产品,直到消费者进入仓库消费掉产品后,将仓库产品数量变为0,生...
  • To_be_Designer
  • To_be_Designer
  • 2015年08月05日 20:37
  • 1315

经典同步问题(一)---生产者与消费者问题

1. 问题描述有界缓冲区的生产者-消费者问题描述: 有一个或多个生产者线程生产某种类型的数据,并放置在缓冲区中;有一个或多个消费者线程从缓冲区中取数据并进行处理,每次取一项;在任何时候只能有一个生产...
  • sunny_ss12
  • sunny_ss12
  • 2015年08月11日 03:28
  • 1880

用共享内存实现生产者和消费者

1、shm_com.h #include #include #define SHM_BUF_SIZE 2048 struct shm_buf {     int num;     c...
  • bv1315008634
  • bv1315008634
  • 2016年10月30日 22:02
  • 530

线程同步-生产者消费者问题

在进行多线程编程时,难免还要碰到两个问题,那就线程间的互斥与同步: 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才...
  • big_bit
  • big_bit
  • 2016年05月09日 21:26
  • 7300

进程、线程、生产者消费者问题

一周没有更新博客了,最近公司的事情有点忙,而且前面的知识感觉又开始生疏...
  • zhaoxiaoyao1987
  • zhaoxiaoyao1987
  • 2014年11月20日 10:28
  • 969

生产者消费者问题【pv操作】

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:     P(S):①将信号量S的值减...
  • houjiyu243042162
  • houjiyu243042162
  • 2015年03月15日 12:55
  • 1694

生产者—消费者模式的两种同步实现

简要问题描述 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由...
  • zhaokx3
  • zhaokx3
  • 2016年06月01日 19:45
  • 1317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生产者-消费者问题
举报原因:
原因补充:

(最多只允许输入30个字)