简体   繁体   English

具有范围/代码块的互斥锁/锁定

[英]Mutex/Lock with scope/codeblock

I remember seeing it in some conference, but can't find any information on this. 我记得在某个会议上看到过它,但是找不到任何信息。

I want something like: 我想要类似的东西:

lock(_somelock)
{
    if (_someBool)
        return;

    DoStuff();
} // Implicit unlock

Instead of: 代替:

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

DoStuff();
unlock(_somelock);

As you can see the code gets very bloated with multiple early returns. 如您所见,该代码变得非常肿,有多个早期回报。 Obviously one could make another function to handle locking/unlocking, but it's a lot nicer no? 显然,可以使另一个函数处理锁定/解锁,但这不是更好吗?

Possible with C++11 standard library? 可以使用C ++ 11标准库吗?

Yes, you can use a std::lock_guard to wrap a mutex. 是的,您可以使用std :: lock_guard包装互斥体。

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

    if (_someBool)
        return;

    DoStuff();

}

The standard idiom is to use a guard object whose lifetime encompasses the locked state of the mutex: 标准习惯用法是使用一个保护对象,该对象的生命周期包含互斥体的锁定状态:

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

You can simply create an autolock of your own. 您可以简单地创建自己的自动锁。

Class AutoLock
{
  pthread_mutex_t *mpLockObj;

  AutoLock(pthread_mutex_t& mpLockObj)
  {
      mpLockObj = &mpLockObj;
      pthread_mutex_lock(mpLockObj);
  }

  ~AutoLock()
  {
     pthread_mutex_unlock(mpLockObj);
  }
};

use like: 用途像:

#define LOCK(obj) AutoLock LocObj(obj);
int main()
{

  pthread_mutex_t lock;
  LOCK(lock);

  return 0; 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM