具有if条件的作用域锁定



我想创建作用域锁,但我想要类似的东西:

{
    if(lockRequired)
        boost::mutex::scoped_lock(Mutex); //After this line we go out of scope
    /* Here I also want to have Mutex */
}

若条件为true,我希望有锁互斥,但在升级范围内。我知道我可以使用简单的.lock和在作用域结束时使用.onlock,但我有很多返回路径。我也可以在作用域中创建一些SynchronizationGuard,其中析构函数被称为解锁互斥,但这不是一个干净的解决方案。有什么建议吗?

致以最良好的问候。

使用三元运算符。

boost::mutex::scoped_lock lock = lockRequired ? 
boost::mutex::scoped_lock(Mutex) : boost::mutex::scoped_lock();

或者只在条件下使用swap

boost::mutex::scoped_lock lock;
if (lockRequired)
{
   boost::mutex::scoped_lock lock_(Mutex);
   lock.swap(lock_);
}

或者用defer_lock_t构造锁,然后调用lock函数。

boost::mutex::scoped_lock lock(Mutex, boost::defer_lock);
if (lockRequired)
{
   lock.lock();
}

您可以构造延迟的锁:

#include <boost/thread.hpp>
int main() {
    boost::mutex mx;
    boost::mutex::scoped_lock sl(mx, boost::defer_lock);
    if (condition)
        sl.lock();
    // sl will unlock on end of scope
}

也适用于std::unique_lockstd::lock_guard和相应的升压类型

类似地,还有adopt_lock标记类型。

最新更新