Вступить в клуб →
средняявопросМногопоточность и синхронизация

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`
  • Уведомление обязано отправляться под тем же захваченным мьютексом, иначе оно теряется всегда

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела