28 lines
1.7 KiB
Markdown
28 lines
1.7 KiB
Markdown
# Задача 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
|
|
на оба события даёт ложные пробуждения.
|