non_full
.
On ajoute également un champ size
pour permettre des queues de différentes
tailles.
type 'a t = { queue : 'a Queue.t; size : int; lock : Mutex.t; non_empty : Condition.t; non_full : Condition.t; } let create k = if k > 0 then { queue = Queue. create(); size = k; lock = Mutex. create(); non_empty = Condition. create(); non_full = Condition.create() } else failwith "Tqueue.create: empty size";; |
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;; |
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
.