mutex.lock与unique_lock

Mor*_*que 31 c++ concurrency mutex locking

我应该何时更喜欢第一段代码到第二段,并且它们有根本区别

std::mutex mtx;
mtx.lock();
... //protected stuff
mtx.unlock();
... //non-protected stuff
mtx.lock();
... //etc
Run Code Online (Sandbox Code Playgroud)

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

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

gbe*_*har 31

是的,这些std::unique_lock调用在析构函数中的互斥锁上解锁.

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

  • 因此,不建议使用简单的互斥锁,因为出现异常可能会导致锁出现问题,而 unique_lock 可以防止这种问题吗? (2认同)

Ric*_*ges 11

想一想:

// define a mutex
std::mutex mtx;
Run Code Online (Sandbox Code Playgroud)

... 很久以后 ...

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
}
Run Code Online (Sandbox Code Playgroud)

  • 这并没有解决提出的任何问题。 (4认同)
  • 这篇文章的编辑队列已满,但本质上,Richard 试图获得的是使用 unique_lock 您不必显式解锁互斥锁 - 当 unique_lock 对象超出范围时它会解锁。 (2认同)