
ResourcePool pool;...
myResource = pool.getResource();
/* use myResource */
pool.releaseResource(myResource);
...
class ResourcePool {
Queue available = new Queue();
TicketQueue waiting = new Queue();
ResourceList getResource(int nr) {
lock(mutex);
int myTicket = ticket++;
while ( available.size() < nr )
![]()
(!waiting.iAmTheBest(myTicket)) ) {
waiting.enter(myTicket, mutex);
}
ResourceList rl = available.getList(nr);
waiting.ok(myTicket);
unlock(mutex);
return rl;
}
void releaseResource(ResourceList rl) {
lock(mutex);
available.put(rl);
waiting.select(mutex);
unlock(mutex);
}
}