Анализ и оценка кода с использованием mutex

foo удерживает cerr_mutex и вызывает bar, которая пытается захватить тот же нерекурсивный mutex. Такое повторное захватывание недопустимо и обычно приводит к зависанию.

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

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

foo удерживает cerr_mutex и вызывает bar, которая пытается захватить тот же нерекурсивный mutex. Такое повторное захватывание недопустимо и обычно приводит к зависанию.

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

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

Условие

Необходимо внимательно проанализировать приведённый пример на C++ и выявить возможные проблемы, связанные с синхронизацией через std::mutex и std::lock_guard. Обратите внимание на то, как мьютекс cerr_mutex захватывается в функциях foo и bar, и оцените, существует ли риск взаимоблокировки при вызове bar() из foo(). При обнаружении недостатков предложите корректные варианты исправления.

# include <iostream>
# include <mutex>

std::mutex cerr_mutex;

int bar()
{
    std::lock_guard<std::mutex> lock(cerr_mutex);
    std::cerr << "bar" << std::endl;

    return 42;
}

void foo()
{
    std::lock_guard<std::mutex> lock(cerr_mutex);
    std::cerr << "foo, bar - " << bar() << std::endl;
}

int main(int argc, char* argv[])
{
    foo();

    return 0;
}

Ответ

foo удерживает cerr_mutex и вызывает bar, которая пытается захватить тот же нерекурсивный mutex. Такое повторное захватывание недопустимо и обычно приводит к зависанию.

Один вариант — получить результат bar до захвата блокировки в foo:

void foo() {
    const int result = bar();
    std::lock_guard<std::mutex> lock(cerr_mutex);
    std::cerr << "foo, bar - " << result << '\n';
}

Порядок сообщений при этом меняется. Если требуется единая критическая секция, выделите внутреннюю функцию bar_unlocked с явным требованием уже захваченного mutex. recursive_mutex допускает рекурсию, но не заменяет продуманного распределения ответственности за блокировки.

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

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

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

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

Подробнее