C++17では、新しいロッククラスが導入されました。std::scoped_lock
。
ドキュメントから判断すると、既存のstd::lock_guard
クラスと似ているようです。
違いは何ですか?いつ使用すればよいですか?
ベストアンサー1
遅い回答ですが、主に次の内容に対する返答です:
非推奨とみなすことができます
std::lock_guard
。
正確に 1 つのミューテックスをロックする必要がある一般的なケースでは、std::lock_guard
よりも少し安全に使用できる API がありますscoped_lock
。
例えば:
{
std::scoped_lock lock; // protect this block
...
}
上記のスニペットは、コンパイルされても何も起こらないため、偶発的な実行時エラーである可能性があります。コーダーはおそらく次のことを意図していました。
{
std::scoped_lock lock{mut}; // protect this block
...
}
ロック/ロック解除できるようになりましたmut
。
上記の 2 つの例で を代わりに使用した場合lock_guard
、最初の例は実行時エラーではなくコンパイル時エラーになり、2 番目の例は を使用するバージョンと同じ機能を持ちますscoped_lock
。
したがって、私のアドバイスは、この作業には最もシンプルなツールを使用することです。
lock_guard
スコープ全体に対して正確に 1 つのミューテックスをロックする必要がある場合。scoped_lock
正確に 1 ではない数のミューテックスをロックする必要がある場合。unique_lock
ブロックのスコープ内でロックを解除する必要がある場合 ( の使用を含むcondition_variable
)。
このアドバイスは、 が 0 ミューテックスを受け入れないように再設計する必要があることを意味するものではあり ませんscoped_lock
。 が、空である可能性のある可変長テンプレート パラメータ パックを受け入れることが望ましい有効な使用例が存在しますscoped_lock
。また、空の場合は何もロックしてはなりません。
これが、lock_guard
が非推奨ではない理由です。scoped_lock
および unique_lock
は の機能のスーパーセットである可能性がありますlock_guard
が、その事実は諸刃の剣です。 場合によっては、型が実行しない内容(この場合はデフォルトの構成) も同様に重要です。