違いは、をロックおよびロック解除できることです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
オーバーヘッドが少し増える可能性があります。
最近では、std::scoped_lock
ではなくを使用する必要があることに注意してくださいstd::lock_guard
。