Какие примитивы синхронизации C++ вы знаете? Чем std::lock_guard отличается от std::unique_lock и зачем может понадобиться ручной unlock?

lock_guard — простая RAII-блокировка на время области видимости. unique_lock умеет отложенный захват, ручные lock/unlock и перемещение, поэтому подходит для более сложного управления.

Короткий ответ

Что ответить на собеседовании

lock_guard — простая RAII-блокировка на время области видимости. unique_lock умеет отложенный захват, ручные lock/unlock и перемещение, поэтому подходит для более сложного управления.

Подробный разбор

Ответ с пояснениями

lock_guard — простая RAII-блокировка на время области видимости. unique_lock умеет отложенный захват, ручные lock/unlock и перемещение, поэтому подходит для более сложного управления.

Из примитивов полезно знать mutex, shared_mutex, condition_variable, atomics, а при соответствующем стандарте — semaphore, latch и barrier.

Ранний unlock нужен, чтобы не удерживать mutex во время долгого I/O или независимого вычисления, но сначала следует восстановить защищаемый инвариант. Часто проще сузить область lock_guard отдельными фигурными скобками. Для condition_variable::wait требуется unique_lock: ожидание временно освобождает mutex и затем захватывает его снова.

Нельзя вручную вызвать unlock у mutex, которым всё ещё владеет lock_guard: его деструктор попытается разблокировать повторно.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее