Il faut introduire une condition supplémentaire non_full. On ajoute également un champ size pour permettre des queues de différentes tailles.
     
   type 'a t =
       { queue : 'a Queue.tsize : intlock : Mutex.t;
         non_empty : Condition.tnon_full : Condition.t; }
   
   let create k =
     if  k > 0 then
       { queue = Queuecreate(); size = klock = Mutexcreate();
         non_empty = Conditioncreate(); non_full = Condition.create() }
     else failwith "Tqueue.create: empty size";;
L’ajout est une combinaison des versions précédentes des fonctions add et take ci-dessus.
     
   let add x q =
     Mutex.lock q.lock;
     while Queue.length q.queue = q.size
     do Condition.wait q.non_full q.lock done;
     if Queue.is_empty q.queue then Condition.broadcast q.non_empty;
     Queue.add q x;
     Mutex.unlock q.lock;;
Le retrait est symétrique à l’ajout (et doit maintenant signaler non_full lorsque la queue est pleine avant le retrait) et est laissé au lecteur. On retrouve le comportement des queues non bornées en choisissant max_int pour size.