Why would I use a
unique_lock<>
wrapper?
I sometimes see code like this
std::unique_lock<std::mutex> lock(m_active_sessions_guard); // lock() the associated mutex
m_active_sessions[request_id] = session;
lock.unlock();
where a unique_lock<>
is created just to lock the associated mutex.
Having searched, I've found that this class is not copyable. Is this the only benefit of using it?
答案 0 :(得分:2)
unique_lock
利用RAII来保证异常安全的代码。请注意C ++ does not have a finally statement。
如果抛出异常,仍会正确释放互斥锁。
答案 1 :(得分:2)
考虑以下代码:
Double
当int func()
{
m_active_sessions_guard.lock();
... some code ...
if (x > y)
{
return -1;
}
... some more code ...
m_active_sessions_guard.unlock();
return 1;
}
为真时,我们在早期回归中“忘记了”unlock
。这可能使我们的程序陷入僵局,或者(更糟糕的是!)导致程序以其他方式缓慢运行/行为异常。
通过使用在调用析构函数时自动解锁锁定的类型,您可以保证不会“忘记”解锁锁定,永远。我肯定花了很多时间寻找这样的问题,我不希望任何人 - 特别是那些触发锁定或运行缓慢的情况只会偶尔发生一次,所以甚至“抓住”失败你必须幸运(也许x > y
只发生在星期四,没有“r”的月份和日期可以被7和3整除。所以,如果你不幸得到最后的错误报告四月,你会调试一段时间...... :)
基础是RAII(“资源分配是初始化”),它与您想要使用x > y
而不是指针并自己调用std::vector
/ new
的逻辑相同。任何时候你都可以让编译器为你完成这项工作,你可以获得“不必记住”的好处。计算机程序,例如编译器,非常善于“记住”事物。