пока рабочий тред будет проходить между последним анлоком и первым локом.
Ну вот, это др дело. Можете (если хотите). Только с чего Вы взяли что это "только в первый раз"? Forever крутит любое число раз, и этот участок кода выполняется каждый раз И насчет "маловероятно" Вы загнули, это еще как вероятно. Разжуем подробно
C++ (Qt)
// thread worker
forever {
// <--- нитка сейчас здесь
mutex.lock();
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
mutex.unlock();
}
Перед первым (в коде) локом мутекс свободен, и count == 0. Теперь смотрим что с др ниткой
C++ (Qt)
//control thread
forever {
getchar();
mutex.lock();
// Sleep until there are no busy worker threads
while (count > 0) {
mutex.unlock();
sleep(1);
<--- а эта нитка сейчас здесь
mutex.lock();
}
keyPressed.wakeAll();
mutex.unlock();
}
Она просыпается, захватывает лок, выходит из while (ведь count == 0), и (веселая, счастливая) вызывает wakeAll (кстати тоже неправильно, но об этом позже). Но на мутексе никто не ждет. Итог - "производитель произвел", а вот "потребитель" - ничего не "потребил". Более того, если производитель шустрый - он может напроизводить много чего - и все будет утеряно.
Думаю это притянуто за уши к пяткам. Ибо это уже вопрос проектирования. Потоки воркеры должны быть созданы и запущены раньше контрольного. Так же они уже все после запуска будут в wait.
Такого рода проектирование должно быть признано неполноценным и не заслуживающим обсуждения. Делая какие-то предположения о скорости выполнения Вы тем самым расписываетесь в том что сделать "просто корректно/нормально" Вы не можете. Зачем оно Вам надо? Ведь сделать правильно проще и лучше
А остальное - критикуем, опровергаем