Why would I use a unique_lock<> wrapper?

时间:2016-02-28 10:14:41

标签: c++ c++11

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?

2 个答案:

答案 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的逻辑相同。任何时候你都可以让编译器为你完成这项工作,你可以获得“不必记住”的好处。计算机程序,例如编译器,非常善于“记住”事物。