lock_guard — простая RAII-блокировка на время области видимости. unique_lock умеет отложенный захват, ручные lock/unlock и перемещение, поэтому подходит для более сложного управления.
Какие примитивы синхронизации C++ вы знаете? Чем std::lock_guard отличается от std::unique_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.