0

以下是Galvin 等人给出的操作系统概念的生产者-消费者问题的伪代码。人。

我们假设池由n缓冲区组成,每个缓冲区都可以容纳一个项目。互斥二进制信号量为对缓冲池的访问提供互斥,并初始化为 value 1

 //initialization
 int n; 
 semaphore mutex = 1; 
 semaphore empty = n; 
 semaphore full = 0;

下面是生产者结构的伪代码:

 while (true) 
{ 
   . . . 
  /* produce an item in next_produced */ 
  . . . 
  wait(empty); 
  wait(mutex); 
  . . . 
  /* add next produced to the buffer */ 
  . . . 
  signal(mutex); 
  signal(full); 
}

下面是消费者结构的伪代码:

 while (true) 
 { 
   wait(full); 
   wait(mutex); 
   . . . 
   /* remove an item from buffer to next_consumed */ 
   . . . 
   signal(mutex); 
   signal(empty); 
   . . . 
   /* consume the item in next consumed */ 
   . . . 
}

以上是就正文而言。让我更进一步,包括缓冲区的工作。让char buffer[n]成为充当缓冲区的两个进程之间的共享数组。所以我们有:

/*Structure of the producer- elaborated by me*/
int i=0;
while (true) 
{ 
   . . . 
  /* produce an item in next_produced */ 
  . . . 
  wait(empty); 
  //wait(mutex); 
  . . . 
  buffer[i]=next_produced; 
  /* add next produced to the buffer */
  i=(i+1)%n; 
  . . . 
  //signal(mutex); 
  signal(full); 
}
/*Structure of the consumer elaborated by me*/
int i=0;
while (true) 
 { 
   wait(full); 
   //wait(mutex); 
   . . . 
   next_consumer=buffer[i]; 
   /* remove an item from buffer to next_consumed */ 
   i=(i+1)%n;
   . . . 
   //signal(mutex); 
   signal(empty); 
   . . . 
   /* consume the item in next_consumed */ 
   . . . 
}

尽管文本在访问缓冲区之前使用了互斥锁(根据他们的逻辑,由于缓冲区是共享项,因此应该以互斥方式访问),但我认为在访问缓冲区时使用互斥锁并不是绝对必要的。缓冲区元素,因为生产者和消费者虽然可以同时访问缓冲区,但我猜他们永远不能同时访问相同buffer数组位置。由于他们不能同时访问同一个位置,因此不可能出现竞争条件......

这就是我的感受。如果我错了,请纠正我。也请指出我犯错误的部分。谢谢你。

4

0 回答 0