It is confusing indeed : get(12) would not block because 12 > 10 ( which is the throttle maximum ) and there is a special case accepting it. It needs to be done in two separate calls to block.

I'm not sure I understand what you suggest. The loop is waiting for **throttle->get_or_fail(1)** to block which will only happen while the **throttle.get()** is waiting in the other thread. Would you be so kind as to explain your idea in more details ?