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