// Invariant: the system is in a safe state. ResourceMgr::Request(int resourceID, int threadID) { lock.Acquire(); assert(isSafe()); while (!wouldBeSafe(resourceID, threadID)) { cv.Wait(&lock); } alloc[resourceID][threadID]++; avail[resourceID]--; assert(isSafe()); lock.Release(); }