std :: mutex лучшие практики - PullRequest
4 голосов
/ 18 июня 2019

Поскольку при выдаче исключения гарантированно выполняется только код, являющийся деструктором, такой код может вызвать утечку памяти

std::mutex foo;
foo.lock();
// My code which might throw an exception
foo.unlock();

Рекомендуется ли делать что-то подобное илиесть другой лучший вариант?Идея состоит в том, чтобы использовать преимущества RAII, чтобы гарантировать, что мьютекс будет освобожден, если возникнет исключение.

std::mutex foo;
{
    std::lock_guard<std::mutex>(foo);
    // My code which might throw an exception
}

Ответы [ 2 ]

12 голосов
/ 18 июня 2019

Лучше ли делать что-то похожее на это?

std::mutex foo;
{
    std::lock_guard<std::mutex>(foo);
    // My code which might throw an exception
}

Нет! Вы создаете здесь временную переменную без имени с окончанием времени жизнив конце строки.Вместо этого убедитесь, что у объекта есть имя, такое, что его время жизни соответствует сроку его действия.

std::mutex foo;
{
    std::lock_guard<std::mutex> NEVER_FORGET_THIS_NAME(foo);
    // My code which might throw an exception
}

Но кроме того, как правило, да, в этой ситуации рекомендуется использовать RAII.А также обратите внимание, что ошибка безымянной блокировки не редкость, посмотрите здесь .

0 голосов
/ 18 июня 2019

Всегда используйте lock_guard, чтобы обеспечить освобождение мьютекса.

...