Вы ищете слишком много совпадений в двух разных, но связанных вещах: мьютекс и переменная условия.
Обычный подход к реализации мьютекса заключается в использовании флага и очереди. Флаг указывает, удерживается ли мьютекс кем-либо (семафор с одним счетом также будет работать), и очередь отслеживает, какие потоки находятся в очереди, ожидая получения мьютекса исключительно.
Затем условная переменная реализуется как другая очередь, прикрепленная к этому мьютексу. Потоки, которые встали в очередь, чтобы дождаться получения мьютекса, могут - обычно после того, как они его приобрели - могут добровольно выйти из передней части строки и вместо этого попасть в очередь условий. На данный момент у вас есть два отдельных набора официантов:
- Те, кто хочет приобрести мьютекс исключительно
- Те, кто ожидает сигнала переменной состояния
Когда поток, содержащий мьютекс, исключительно сигнализирует переменную условия, для которой мы пока предположим, что это единственный сигнал (запускающий не более одного ожидающего потока), а не широковещательная передача (освобождая все ожидающие потоки), первый поток в очереди переменных условий перенаправляется обратно в начало (обычно) очереди мьютекса. Как только поток, в настоящее время содержащий мьютекс - обычно поток, который сообщил условную переменную - освобождает мьютекс, следующий поток в очереди мьютекса может получить его. Этот следующий поток в очереди был тем, который был во главе очереди условных переменных.
В игру вступает много сложных деталей, но этот набросок должен дать вам представление о структурах и операциях в игре.