生产者-消费者问题

来源:互联网 发布:视觉对位算法角度 编辑:程序博客网 时间:2024/05/30 22:59

单生产者P—单消费者C—单缓冲区B问题

1)进程互斥问题:缓冲区B是临界资源,进程P和C不能同时对B进行操作,即只能互斥的操作
2)进程同步问题:P不能往“满”的的缓冲区B放产品,C不能从空的缓冲区获得产品。当缓冲区满时,C必须先于P执行,当缓冲区空时,P必须先于C执行;
我们给出如下基于记录型(二元)信号量机制的解法
[cpp] view plaincopyprint?
  1. //  [10/9/2013 qingezha]    1生产者-1消费者-1缓冲区 
  2. //P进程不能往满的缓冲区放产品,设置信号量为s1 
  3. //C进程不能从空的缓冲区取得产品,设置信号量为s2 
  4. //s1的初值为1 ,s2的初值为0,因为只有先生产产品才可以接着消费产品 
  5. //P: 
  6.     while (1) 
  7.     { 
  8.         //生产产品 
  9.         P(s1);//获得B 
  10.         //向B放产品 
  11.         V(s2);//通知C取产品 
  12.     } 
  13. //C: 
  14.     while (1) 
  15.     { 
  16.         P(s2);//得到通知,获得B 
  17.         //取产品 
  18.         V(s1);//通知P生产 
  19.         //消费产品 
  20.     } 
//  [10/9/2013 qingezha]1生产者-1消费者-1缓冲区//P进程不能往满的缓冲区放产品,设置信号量为s1//C进程不能从空的缓冲区取得产品,设置信号量为s2//s1的初值为1 ,s2的初值为0,因为只有先生产产品才可以接着消费产品//P:while (1){//生产产品P(s1);//获得B//向B放产品V(s2);//通知C取产品}//C:while (1){P(s2);//得到通知,获得B//取产品V(s1);//通知P生产//消费产品}

单生产者P—单消费者C—多缓冲区B问题

1)进程互斥问题:缓冲区B是临界资源,进程P和C不能同时对B进行操作,即只能互斥的操作
2)进程同步问题:P不能往“满”的的缓冲区B放产品,C不能从空的缓冲区获得产品。当缓冲区满时,C必须先于P执行,当缓冲区空时,P必须先于C执行;但是这里缓冲区大小为n,所以不能简单的使用互斥信号量来表示。
我们给出如下基于(多元)信号量机制的解法
[cpp] view plaincopyprint?
  1. //  [10/9/2013 qingezha]    1生产者-1消费者-多缓冲区 
  2. //P进程不能往满的缓冲区放产品,设置信号量为s1 
  3. //C进程不能从空的缓冲区取得产品,设置信号量为s2 
  4. //s1的初值为n ,s2的初值为0,因为只有先生产产品才可以接着消费产品 
  5. //P: 
  6.     int i = 0; 
  7.     while (1) 
  8.     { 
  9.         //生产产品 
  10.         P(s1);//获得B 
  11.         //向B放产品 
  12.         i = (i+1)%n;//环状队列 向buffer[i]放产品 
  13.         V(s2);//通知C取产品 
  14.     } 
  15. //C: 
  16.     int j = 0; 
  17.     while (1) 
  18.     { 
  19.         P(s2);//得到通知,获得B 
  20.         //取产品 
  21.         j = (j+1)%n;//环状向buffer[j]取产品 
  22.         V(s1);//通知P生产 
  23.         //消费产品 
  24.     } 
//  [10/9/2013 qingezha]1生产者-1消费者-多缓冲区//P进程不能往满的缓冲区放产品,设置信号量为s1//C进程不能从空的缓冲区取得产品,设置信号量为s2//s1的初值为n ,s2的初值为0,因为只有先生产产品才可以接着消费产品//P:int i = 0;while (1){//生产产品P(s1);//获得B//向B放产品i = (i+1)%n;//环状队列 向buffer[i]放产品V(s2);//通知C取产品}//C:int j = 0;while (1){P(s2);//得到通知,获得B//取产品j = (j+1)%n;//环状向buffer[j]取产品V(s1);//通知P生产//消费产品}
还有

M个生产者—K个消费者—N个缓冲区问题

待续!!