【问题标题】:Scoped lock with if condition带有 if 条件的作用域锁
【发布时间】:2015-02-20 01:30:23
【问题描述】:

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

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

如果条件为真,我想要锁定互斥体,但在升级范围内。我知道我可以使用简单的 .lock 并在范围结束时使用 .unlock 但我有很多返回路径。我还可以在范围内创建一些 SynchronizationGuard,并将析构函数称为解锁互斥锁,但这不是干净的解决方案。一些建议?

最好的问候。

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    使用三元运算符。

    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();
    }
    

    【讨论】:

    • 哦,我没看到你在答案的第二部分有defer_lock。第一部分让我觉得太老套了,无法推荐
    【解决方案2】:

    你可以construct the lock deferred:

    #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标签类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-21
      • 2016-01-23
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多