生产者与消费者问题

by 曾经沧海
413 阅读

生产者与消费者问题
1生产者与消费者问题
int full = 0;       / 满缓冲单元的数目
int mutex = 1;     / 对缓冲区进行操作的互斥信号量
void producer( void );
void consumer( void );
int main( void )
{
   cobegin
       producer();
       consumer();
   coend
}
void produceri( void )
{
   while( 生产未完成 )  {
      生产一个产品;
      p( mutex );
      送一个产品到有界缓冲区;
      v( mutex );
      v( full );
   }
}
consumerj
{
     while( 还要继续消费 )  {
p( full );
p( mutex );
从有界缓冲区中取产品;
v( mutex );
消费一个产品;
   }
}

2 有界缓冲问题
有m 个生产者和k 个消费者,共享存放n 个产品的缓冲单元。用PV 操作进行控制
第一种算法:任意时刻,同时仅允许1个生产者和1个消费者进入的算法
int full = 0;       / 满缓冲单元的数目
int empty = n;     / 空缓冲单元的数目
int mutex1 = 1;     / 对有界缓冲区进行操作用于生产者间的互斥信号量
int mutex2 = 1;     / 对有界缓冲区进行操作用于消费者间的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
   cobegin
       produceri();      / i = 1,2,…,m
       consumerj();     / j = 1,2,…,k
   coend
}
void produceri( void )
{
   while( 生产未完成 )  {
      生产一个产品;
      p( empty );
      p( mutex1 );
      送一个产品到有界缓冲区;
      v( mutex1 );
      v( full );
   }
}
viod consumerj( void ){
     while( 还要继续消费 )  {
p( full );
p( mutex2 );
从有界缓冲区中取产品;
v( mutex2 );
v( empty );
消费一个产品;
   }
}
第二种算法:任意时刻,只允许1个生产者或1个消费者进入的算法
int full = 0;       / 满缓冲单元的数目
int empty = n;     / 空缓冲单元的数目
int mutex = 1;     / 对有界缓冲区进行操作的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
   cobegin
       produceri();      / i = 1,2,…,m
       consumerj();     / j = 1,2,…,k
   coend
}
void produceri( void )
{
   while( 生产未完成 )  {
      生产一个产品;
      p( empty );
      p( mutex );
      送一个产品到有界缓冲区;
      v( mutex );
      v( full );
   }
}
viod consumerj( void ){
     while( 还要继续消费 )  {
p( full );
p( mutex );
从有界缓冲区中取产品;
v( mutex );
v( empty );
.
.
.
消费一个产品;
   }
}
3 无界缓冲问题
有m 个生产者和k 个消费者,共享存放无数个产品的缓冲单元。用PV 操作进行控制
第一种算法:
int full = 0;       / 满缓冲单元的数目
int mutex = 1;     / 对有界缓冲区进行操作的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
   cobegin
       produceri();      / i = 1,2,…,m
       consumerj();     / j = 1,2,…,k
   coend
}
void produceri( void )
{
   while( 生产未完成 )  {
      生产一个产品;
      p( mutex );
      送一个产品到有界缓冲区;
      v( mutex );
      v( full );
   }
}
viod consumerj( void )
{
     while( 还要继续消费 )  {
p( full );
p( mutex );
从有界缓冲区中取产品;
v( mutex );
消费一个产品;
   }
}
第二种算法:定义一正整数 N,表示缓冲区当前存放的产品数( 包括 n = 0 )
int full = 0;       / 满缓冲单元的数目
int mutex = 1;     / 对有界缓冲区进行操作的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
   cobegin
       produceri();      / i = 1,2,…,m
       consumerj();     / j = 1,2,…,k
   coend
}
void produceri( void )
{
   while( 生产未完成 )  {
      生产一个产品;
      p( mutex );
      送一个产品到有界缓冲区;
      if( n == 1 )
         v( full );
      v( mutex );
   }
}
viod consumerj( void )
{
     while( 还要

发表评论