web-dev-qa-db-ja.com

mutex.lock vs unique_lock

2番目のコードよりも最初のコードを優先する場合、どのような場合に根本的な違いがありますか

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であると理解していますが、mutexとmutexを使用するロックを区別するのに苦労しています。

31
Morgan Fouque

はい std::unique_lockは、デストラクタのミューテックスでロック解除を呼び出します。

これの利点は、何らかの例外がスローされた場合、std::unique_lockが定義されています。

30
gbehar

このように考えてください:

// 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
}
9
Richard Hodges