A blocking lock, as opposed to a spinlock, is a type of lock that will block a thread when it cannot run if it is waiting on a lock to be unheld. A thread waiting for an event should block so that other threads may run in the meantime, enabling our CPU to do something else while waiting. It should be unblocked when the event happens.

These will also implement different queues for each event notification, so that for every event that happens there’s a different queue with threads waiting for it. The most common implementation of blocking locks are mutexes.