Исходя из этого, вы должны создать свой собственный класс семафоров. Вы можете иметь закрытую переменную-член для увеличения / уменьшения, как с семафором, и иметь двоичный закрытый член-семафор, чтобы сделать эти увеличения / уменьшения атомарными. Есть релиз / приобретение публичных методов, которые будут делать inc / dec. Когда счетчик обнулится, освободите двоичный семафор и дождитесь условия (другого мьютекса). Когда другой поток вызывает метод release для вашего класса семафоров, а значение счетчика теперь выше нуля, подайте сигнал всем тем, кто ожидает выполнения условия, и попытайтесь повторно получить ваш семафор.
Надеюсь, что это помогает и имеет смысл.