boost::recursive_mutex m;
m.lock();
与
boost::lock_guard<boost::recursive_mutex> lock( mutex_ );
使用第一张表格是否有优势?第二种形式是否仅提供RAII机智,还是有其他优势?
答案 0 :(得分:5)
使用lock_guard的优点是当它超出范围时会释放锁。这消除了手动释放锁定的需要并减少了忘记锁定的可能性。
boost::recursive_mutex mylock;
{
boost::lock_guard<boost::recursive_mutex> lock( mylock );
// do something
if(false == do_something())
{
return; // "lock" goes out of scope and unlocks 'mylock' from it's destructor.
}
}
// "lock" has gone out of scope and unlocked 'mylock' from it's destructor.
答案 1 :(得分:2)
这两种形式至少不相同。这是与第二种形式相同的*:
boost::recursive_mutex m;
m.lock();
try {
// ...
} catch(...) {
m.unlock();
throw;
}
m.unlock();
这就是你所说的“仅”提供RAII:避免使用可怕的样板来提供相同水平的正确性。
*:有警告;看其他答案&amp;评论