【问题标题】:Mutex/Lock with scope/codeblock互斥/锁定与范围/代码块
【发布时间】:2014-04-10 08:48:52
【问题描述】:

我记得在某个会议上看到过,但找不到任何相关信息。

我想要类似的东西:

lock(_somelock)
{
    if (_someBool)
        return;

    DoStuff();
} // Implicit unlock

代替:

lock(_somelock);
if (_someBool)
{
    unlock(_somelock);
    return;
}

DoStuff();
unlock(_somelock);

如您所见,由于多次提前返回,代码变得非常臃肿。 显然可以创建另一个函数来处理锁定/解锁,但它会更好吗?

可以使用 C++11 标准库吗?

【问题讨论】:

标签: c++ multithreading c++11 mutex standard-library


【解决方案1】:

是的,您可以使用std::lock_guard 来包装互斥锁。

{
   std::lock_guard<std::mutex> lock(your_mutex);

    if (_someBool)
        return;

    DoStuff();

}

【讨论】:

    【解决方案2】:

    标准习惯用法是使用一个保护对象,其生命周期包含互斥锁的锁定状态:

    std::mutex m;
    int shared_data;
    
    // somewhere else
    
    void foo()
    {
        int x = compute_something();
    
        {
            std::lock_guard<std::mutex> guard(m);
            shared_data += x;
        }
    
        some_extra_work();
    }
    

    【讨论】:

      【解决方案3】:

      您可以简单地创建自己的自动锁定。

      Class AutoLock
      {
        pthread_mutex_t *mpLockObj;
      
        AutoLock(pthread_mutex_t& mpLockObj)
        {
            mpLockObj = &mpLockObj;
            pthread_mutex_lock(mpLockObj);
        }
      
        ~AutoLock()
        {
           pthread_mutex_unlock(mpLockObj);
        }
      };
      

      像这样使用:

      #define LOCK(obj) AutoLock LocObj(obj);
      int main()
      {
      
        pthread_mutex_t lock;
        LOCK(lock);
      
        return 0; 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多