生产者与消费者问题
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
(一)定义:
一组生产者向一组消费者提供产品的问题,生产者与消费者共享一个缓冲区,生产者向其中放产品,消费者从中取产品。
(二)解析:
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
相关文章推荐
- 带信号量的生产者消费者问题
- 用vc实现生产者消费者问题
- 用vc实现生产者消费者问题
- 用vc实现生产者消费者问题
- TT和LG编程系列之线程(生产者和消费者问题)
- 生产者与消费者问题
- Windows线程(生产者与消费者问题)
- java实现 生产者和消费者问题 多线程同步示例
- 用JAVA 实现“生产者-消费者”问题
- 生产者消费者问题的java实现
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- 生产者-消费者问题
- 生产者-消费者问题
- 生产者,消费者问题
- 用JAVA 实现“生产者-消费者”问题
- 生产者-消费者问题
- C#编写的多生产者多消费者同步问题
- 生产者/消费者问题在windows2000下的实现
- 关于生产者-消费者问题
- 用C#线程技术模拟“生产者-消费者”经典进程同步问题