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を使用するロックを区別するのに苦労しています。
はい std::unique_lock
は、デストラクタのミューテックスでロック解除を呼び出します。
これの利点は、何らかの例外がスローされた場合、std::unique_lock
が定義されています。
このように考えてください:
// 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
}