# Задача 06 — потокобезопасная ограниченная очередь (C++) Классический вопрос на собеседовании в embedded/сетевую разработку: не «знаешь ли ты std::thread», а «умеешь ли ты не сломать счётчик под нагрузкой». ```c++ class BlockingQueue { public: explicit BlockingQueue(size_t capacity); ~BlockingQueue(); void push(int v); // блокируется, пока очередь полна bool pop(int& out); // блокируется, пока пуста; false — если закрыта и пуста void close(); // после close: pop() опустошает остаток и отдаёт false size_t size() const; }; ``` Требования: - push после close() бросает `std::runtime_error`; - закрытие разблокирует все ждущие потоки (никакого вечного ожидания и busy-wait); - размер очереди никогда не превышает capacity; - ни одной гонки: тест собирается и гоняется с ThreadSanitizer (в том числе `size()` вызывается из другого потока — он тоже должен быть потокобезопасным). Проверка: `python3 grade.py 06`. Критерий: все `ok`, TSan чистый, нет зависания. Разбор после сдачи: почему нужен predicate-цикл вокруг wait, и как один condition_variable на оба события даёт ложные пробуждения.