condition_variable без предиката
Очередь задач в пуле потоков:
std::unique_lock<std::mutex> lk(m);
cv.wait(lk);
Task t = queue.front();
queue.pop();
Изредка воркер падает на пустой очереди, а иногда задача лежит в очереди, но никто её не берёт. Что не так?
- Нужно вызывать `notify_all` вместо `notify_one`: тогда проснутся все воркеры сразу
- `wait` без предиката возвращается и от ложных пробуждений, и не слышит уведомление, отправленное до входа в ожидание
- `unique_lock` не подходит для условной переменной, нужен `lock_guard`
- Уведомление обязано отправляться под тем же захваченным мьютексом, иначе оно теряется всегда
