std :: mutex最佳做法

时间:2019-06-18 08:57:21

标签: c++ exception raii

由于引发异常时,确保运行的唯一代码是析构函数,因此此类代码可能会产生内存泄漏

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 个答案:

答案 0 :(得分:12)

  

这是最佳做法吗?

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是一个好习惯。还要注意,未命名的锁卫程序错误并不少见,请看here

答案 1 :(得分:0)

始终使用lock_guard确保互斥量将被释放。