monitor storage {
  int components[16];
  (condition, int) waiting[16];

  procedure entry add(int[16] c) {
    for(int i = 0; i < 16; ++i)
      components[i] += c[i]
      repeat(waiting[i].second)
        waiting[i].first.signal()
  }

  procedure entry get(int[16] requirements) {
    for(int i = 0; i < 16; ++i)
      if(requirements[i] > components[i])
        ++waiting[i].second
        while(requirements[i] > components[i])
          waiting[i].first.wait()
        --waiting[i].second
      components[i] -= requirements[i]
  }
}

1) Non ci puo' essere deadlock poiche' l'unica relazione di dipendenza e' quella
   che lega gli operai in attesa ai magazzinieri. I magazzinieri saranno sempre
   in grado di riempire il magazzino e dunque prima o poi i processi in attesa
   verranno sbloccati.

2) Non ci puo' essere starvation poiche' i processi richiedenti lasciano subito
   la critical section quando si bloccano, dunque prima o poi terminereanno di
   richiedere risorse e sara' possibile per i magazzinieri sbloccare la coda e
   rifornire il magazzino.