码迷,mamicode.com
首页 > 其他好文 > 详细

生产者-消费者问题

时间:2014-12-16 20:55:03      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   sp   strong   on   数据   div   问题   

    生产者-消费者问题有时也称作有界缓冲区问题。

    两个进程共享一个固定大小的缓冲区,生产者将信息放入缓冲区,消费者从缓冲区中取出信息。

    问题在于 当缓冲区已满,而此时生产者还想向其中放入一个新的数据项情况。其解决办法是让生产者睡眠,待消费者从缓存区取出一个或者多个数据的时候再唤醒它。同样的,当消费者试图从缓存区中取出数据而发现缓存区为空时,消费者就睡眠,直到生产者向其中放入一些数据时再将其唤醒

 1 #define N 100                                      /*缓冲区中的槽数目*/
 2 int count = 0;                                     /*缓冲区中的数据项数目*/
 3 
 4 //producer
 5 void producer(void)    
 6 {
 7   int item;
 8 
 9   while(TRUE){                                     /*无限循环*/
10     item = produce_item();                         /*产生下一新数据项*/
11     if(count == N) sleep();                        /*如果缓冲区满了,就进入休眠状态*/
12     insert_item(item);                             /*将(新)数据项放入缓冲区中*/
13     count = count + 1;                             /*将缓冲区的数据项计数器增1*/
14     if(count == 1) wakeup(consumer);               /*缓冲区空吗?*/
15     }         
16 }
17 
18 //consumer
19 void consumer(void)
20 {
21 while(TRUE){                                       /*无限循环*/
22     if(count == 0) sleep();                        /*如果缓冲区空,则进入休眠状态*/
23     item = remove_item();                          /*从缓冲区中取出一个数据项*/
24     count = count - 1;                             /*将缓冲区的数据项计数器减1*/
25     if(count == N-1) wakeup(producer);             /*缓冲区慢吗?*/
26     consume_item(item);                            /*打印数据项*/
27     }         
28 }

    现在要讨论的是,可能出现竞争条件的状况。其原因是对count的访问未加限制,有可能出现以下情况:缓冲区为空,消费者刚刚读取count的值发现它为0。此时调度程序决定暂停消费者并启动运行生产者。生产者向缓冲区中加一个数据项,count加1,现在count的值变成了1。它推断认为由于count刚才为0,所以消费者此时一定在睡眠,于是生产者调用wakeup来唤醒消费者!

    但是,消费者此时在逻辑上并未睡眠,所以wakeup信号丢失,当消费者下次运行的时候,他将测试先前读到的count值,发现他为0,于是睡眠。生产者迟早会填满整个缓冲区,然后睡眠!

    解决方法:唤醒等待位

生产者-消费者问题

标签:style   blog   color   sp   strong   on   数据   div   问题   

原文地址:http://www.cnblogs.com/lovejin/p/4167836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!