違いは、をロックおよびロック解除できることです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。