А, кажется дошло как обойтись без SignalAndWait. Поток ставит себя в очередь "пробудки" до выхода из эксклюзивного блока, затем спокойно выходит из него и пробует заснуть, в том случае если его к этому времени уже "разбудили", то он и не будет засыпать. Но тут надо каждый поток заранее (при его создании) снабдить семафором. Количество семафоров = количеству потоков. Количество очередей = количеству условий ожидания.