Files
eduplan-cpp-eltex/diag/tasks/06_threads/task.md
T

1.7 KiB

Задача 06 — потокобезопасная ограниченная очередь (C++)

Классический вопрос на собеседовании в embedded/сетевую разработку: не «знаешь ли ты std::thread», а «умеешь ли ты не сломать счётчик под нагрузкой».

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 на оба события даёт ложные пробуждения.