【问题标题】:mutex.lock vs unique_lockmutex.lock 与 unique_lock
【发布时间】:2016-10-23 02:04:49
【问题描述】:

什么时候我应该更喜欢第一段代码而不是第二段,它们是否有根本区别

std::mutex mtx;
mtx.lock();
... //protected stuff
mtx.unlock();
... //non-protected stuff
mtx.lock();
... //etc

std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
... //protected stuff
lck.unlock();
... //non-protected stuff
lck.lock();
... //etc

我知道 lock_guard 基本上是一个没有锁定和解锁功能的 unique_lock,但我很难区分互斥锁和使用互斥锁的锁。

【问题讨论】:

标签: c++ concurrency locking mutex


【解决方案1】:

是的,std::unique_lock 在其析构函数中调用互斥锁解锁。

这样做的好处是,如果抛出一些异常,您可以确定互斥锁会在离开定义 std::unique_lock 的范围时解锁。

【讨论】:

  • 因此不建议使用简单的互斥锁,因为出现异常可能会导致锁出现问题,而 unique_lock 可以防止?
  • 如果你在锁里面的代码可以抛出异常,那么可以。如果您只锁定一次,并在最后解锁,那么 std::lock_guard 也可以完成这项工作,而且它比 std::unique_lock 更简单
【解决方案2】:

这样想:

// define a mutex
std::mutex mtx;

...很久以后...

void something_safe()
{

  // code in these braces is a critical section
  {
    auto lock = std::unique_lock<std::mutex>(mtx); // equivalent to mtx.lock();
    ... //protected stuff
  }  // <---- however you leave this brace, equivalent to mtx.unlock();

  ... //non-protected stuff
}

【讨论】:

  • 这并没有解决所提出的任何问题。
  • 这篇文章的编辑队列已满,但基本上 Richard 想要获得的是使用 unique_lock 您不必显式解锁互斥锁 - 它会在 unique_lock 对象退出时解锁范围。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多