Вы можете звонить только в ожидании, пока удерживаете блокировку мьютекса.Таким образом, код должен быть:
mutex.lock();
try {
// do your stuff
threads[id].await();
} finally {
mutex.unlock();
}
Причина, по которой я добавил команду try / finally, заключается в том, чтобы гарантировать, что блокировка снята, даже если вы выдаваете исключение.
Вероятно, также стоит отметитьчто вы можете звонить signal
только в ваших условиях, также удерживая блокировку на мьютексе.Вы можете получить блокировку мьютекса, даже если вы получили блокировку перед вызовом await, потому что вызов await
заставляет ожидающий поток снять блокировку, пока он ждет.