怀疑如何锁定助推互斥锁

时间:2011-07-17 13:24:38

标签: c++ boost mutex

boost::recursive_mutex m;
m.lock();

boost::lock_guard<boost::recursive_mutex> lock( mutex_ );

使用第一张表格是否有优势?第二种形式是否仅提供RAII机智,还是有其他优势?

2 个答案:

答案 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;评论