違いは、ロックとロック解除ができることですstd::unique_lock
。std::lock_guard
建設時に一度だけロックされ、破壊時にロックが解除されます。
したがって、ユース ケース B の場合std::unique_lock
、条件変数には必ず a が必要です。A の場合、ガードを再ロックする必要があるかどうかによって異なります。
std::unique_lock
たとえば、ミューテックスをすぐにロックせずに構築できますが、RAII ラッパーを構築できます (こちらを参照)。
std::lock_guard
便利な RAII ラッパーも提供しますが、複数のミューテックスを安全にロックすることはできません。限定された範囲のラッパーが必要な場合に使用できます。例: メンバー関数:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
}
};
chmike で質問を明確にするため、デフォルトstd::lock_guard
でstd::unique_lock
は と同じです。したがって、上記の場合、 に置き換えることができstd::lock_guard
ますstd::unique_lock
。ただし、std::unique_lock
オーバーヘッドが少し増える可能性があります。
最近 (C++17 以降)std::scoped_lock
の代わりに を使用する必要があることに注意してくださいstd::lock_guard
。