Solution to the Producer-Consumer problem using Semaphores

One problem with implementing a Sleep and Wakeup policy is the potential for losing Wakeups. Semaphores solve the problem of lost wakeups. In the Producer-Consumer problem, semaphores are used for two purposes:


In the following example there are three semaphores. Full, used for counting the number of slots that are full; empty, used for counting the number of slots that are empty; and mutex, used to enforce mutual exclusion.

  BufferSize = 3;

  semaphore mutex = 1;              // Controls access to critical section
  semaphore empty = BufferSize;     // counts number of empty buffer slots
  semaphore full = 0;               // counts number of full buffer slots

  Producer()
  {
    int widget;

    while (TRUE) {                  // loop forever
      make_new(widget);             // create a new widget to put in the buffer
      down(&empty);                 // decrement the empty semaphore
      down(&mutex);                 // enter critical section
      put_item(widget);             // put widget in buffer
      up(&mutex);                   // leave critical section
      up(&full);                    // increment the full semaphore
      }
  }

  Consumer()
  {
    int widget;
      
    while (TRUE) {                  // loop forever
      down(&full);                  // decrement the full semaphore
      down(&mutex);                 // enter critical section
      remove_item(widget);          // take a widget from the buffer
      up(&mutex);                   // leave critical section
      up(&empty);                   // increment the empty semaphore
      consume_item(widget);         // consume the item
      }
  }

               
IPC Home    Subway    Problems   Producer/ Monitors
  Page       Map                Consumer