您的位置:首页 > 其它

生产者与消费者问题

2014-09-03 19:44 751 查看
生产者与消费者问题:

 

(一)定义:

一组生产者向一组消费者提供产品的问题,生产者与消费者共享一个缓冲区,生产者向其中放产品,消费者从中取产品。

(二)解析:

1.生产者只有存在空闲的缓冲区单元时才可以向其中放产品,令空闲缓冲区的信号量为empty;

2.消费者只有存在满缓冲区时才可以取产品,令满缓存区的信号量为full.

3.缓冲区为一个临界资源,使用一个互斥信号量mutex来保证生产者和消费者不能同时访问缓冲区。

(三)注意:

1.full+empty=缓冲区的个数;

2.如果缓冲区单元的个数>1,则需要设置互斥信号量;

如果缓冲区的单元个数只有1个,则可以不设置互斥信号量;与生产者,消费者的人数无关。

3.先后顺序1:

向缓冲区放产品->从缓冲区取产品:

所以:向缓冲区放产品,V(full),P(full),从缓冲区取产品;

V(full)为发生消息,P(full)为接受消息;

4.先后顺序2:

从缓冲区取产品->向缓冲区放产品;

所以:从缓冲区取产品,V(empty),P(empty),向缓冲区放产品;

V发送消息,P接受消息。

5.对临界资源的保护:

P->临界资源->V

6.生产者,消费者问题是典型的进程同步的问题;

(四)实现:

/*多个生产者,多个消费者,n个缓冲区单元*/

Semaphore full=0;//满缓冲区单元个数

Semaphore empty=n;//空缓冲区单元个数

Semaphore mutex=1;//控制对临界区的互斥信号量

main(){

 

 producer();

 consumer();

}

//生产者进程

producer(){

 while(1){

  生产一个产品produce;

  p(empty);//空单元个数-1

  p(mutex);//保护临界资源

  buffer[i]=produce;//将产品放入缓冲区;

  i=(i+1)%n;

  v(mutex);

  v(full);//满单元个数+1;

 }

}

//消费者进程

consumer(){

 while(1){

  p(full);//满单元个数-1

  p(mutex);//保护临界资源

  producer=buffer[out];//从缓冲区中取一个产品

  out=(out+1)%n;

  v(mutex);

  v(empty);

 }

}

(五)拓展:

(1)拓展一:

1)问题:

一个生产者,一个消费者,一个缓冲区单元;

2)实现:

Semaphore empty=1;

Semaphore full=0;

main(){

 producer();

 consumer();

}

//生产者进程:

producer(){

 while(1){

  p(empty);

  向缓冲区放产品;

  v(full);

 }

}

//消费者进程:

consumer(){

 while(1){

  p(full);

  从缓冲区取产品;

  f(empty);

 }

}

3)分析:

因为只有一个缓冲区单元,所以生产者与消费者不可能同时访问缓冲区,所以不需要设置互斥变量保护缓冲区,与生产者,消费者个数无关。

----

(2)拓展二:

1)问题:

多个生产者,一个消费者,一个缓冲区单元:

2)实现:

同上

----

(3)拓展三:

1)问题:

一个生产者,一个消费者,n个缓冲区单元;

2)实现:

同多个生产者,多个消费者,n个缓冲区单元;

3)分析:

如果不设置mutex互斥信号量对缓冲区保护,则是错误的,即使消费者,生产者只有一个。

如:消费者放一个产品,然后消费者再放入一个产品,此时full=2;

如果此时消费者与生产者同时访问缓冲区,由于没有mutex互斥信号量的保护,所以可以同时访问缓冲区。

--

(六)生产者,消费者变形:
http://blog.csdn.net/legend050709/article/details/39031821
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  生产者与消费者