生产者-消费者问题

原创 2004年12月31日 17:29: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,消费

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

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


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

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

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

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

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

操作系统中生产者/消费者问题(一)

生产者/消费者是个典型的进程同步问题,只有生产者生产出来东西了,消费者才能消费 也就是说,生产者生成出来一个东西,然后通知消费者,(东西好了,快来拿吧),而消费者则查看缓冲器里面有没有东西,若没有则会...
  • best_fiends_zxh
  • best_fiends_zxh
  • 2016年09月29日 19:38
  • 884

生产者-消费者问题详解

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:     P(S):①将信号量...
  • ahuang1900
  • ahuang1900
  • 2014年09月06日 13:01
  • 2171

生产者消费者问题(Linux多线程下两种实现)

生产者消费者问题是同步问题中的一种常见情况,节
  • u011056004
  • u011056004
  • 2014年08月01日 10:16
  • 3048

生产者消费者问题(C实现)

原文地址:http://blog.csdn.net/chen_mama/article/details/47347261生产者消费者问题是操作系统中的一个经典的问题。他描述的是一个,多个生产者与多个消...
  • ZhichengYee
  • ZhichengYee
  • 2016年10月09日 16:28
  • 3471

多线程之生产者消费者问题

在多线程编程过程中,为了保证是原子操作,必须处理好线程之间的同步和互斥,生产者消费者问题即是线程间同步和互斥的经典例子。 生产者消费者问题的描述: 生产者负责生产“产品”,消费者负责消费“产品”,...
  • miraclewgf
  • miraclewgf
  • 2015年09月09日 21:35
  • 759

生产者消费者问题(PV操作)

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

C++多线程学习:生产者消费者问题

多线程相关知识点: C++11 线程库:http://zh.cppreference.com/w/cpp/thread 互斥量和锁 std::unique_lock::lock 和 std::uni...
  • quzhongxin
  • quzhongxin
  • 2015年08月19日 20:56
  • 5513

信号量与生产者消费者问题

生产者—消费者问题 生产者—消费者题型在各类考试(考研、程序员证书、程序员面试笔试、期末考试)很常见,原因之一是生产者—消费者题型在实际的并发程序(多进程、多线程)设计中很常见;之二是这种题型综合性...
  • fuzhongmin05
  • fuzhongmin05
  • 2017年01月19日 15:06
  • 3122

最简单的生产者消费者-pthread

最基本的生产者消费者模型: 一个生产者 一个消费者 一个BUFFER 一个锁 两个条件变量 /*pthread_cond_wait的大致操作流程: 解除已被调用线程锁住的锁 等待条件,睡眠...
  • aganlengzi
  • aganlengzi
  • 2016年05月08日 13:23
  • 2095

Java多线程之生产者消费者问题<一>:使用synchronized 关键字解决生产者消费者问题

今天看了一片博文,讲Java多线程之线程的协作,其中作者用程序实例说明了生产者和消费者问题,但我及其他读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的例子也都存在bug,经过仔细研究发现其中的问...
  • feichenwangyalin
  • feichenwangyalin
  • 2014年10月16日 22:22
  • 1886
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生产者-消费者问题
举报原因:
原因补充:

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