Semaphore

HardPromises & Async25 min4 tests

Implement createSemaphore(permits) that controls concurrent access to a shared resource.

Requirements

  • acquire() — returns a Promise that resolves when a permit is available. Decrements the permit count.
  • release() — frees one permit, allowing a waiting acquirer to proceed.
  • If permits are available, acquire() resolves immediately.
  • If no permits are available, acquire() waits until one is released.

Example

const sem = createSemaphore(2);
await sem.acquire(); // resolves immediately (permits: 1)
await sem.acquire(); // resolves immediately (permits: 0)
sem.acquire();       // waits... (no permits)
sem.release();       // now the waiting acquire resolves
Hints (5)
  1. Track the number of available permits with a counter.
  2. If a permit is available on acquire(), decrement and resolve immediately.
  3. If no permits are available, push the resolve callback to a wait queue.
  4. On release(), if there are waiters, shift one off and call its resolve.
  5. If no waiters exist on release(), just increment the available counter.

Topics

  • Promises & Async

Asked at

Google · Amazon · Apple · Netflix

Join Us
blur