std::lock_guard と std::scoped_lock のどちらですか? 質問する

std::lock_guard と std::scoped_lock のどちらですか? 質問する

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

したがって、私のアドバイスは、この作業には最もシンプルなツールを使用することです。

  1. lock_guardスコープ全体に対して正確に 1 つのミューテックスをロックする必要がある場合。

  2. scoped_lock正確に 1 ではない数のミューテックスをロックする必要がある場合。

  3. unique_lockブロックのスコープ内でロックを解除する必要がある場合 ( の使用を含むcondition_variable)。

このアドバイスは、 が 0 ミューテックスを受け入れないように再設計する必要があることを意味するものではあり ませんscoped_lock。 が、空である可能性のある可変長テンプレート パラメータ パックを受け入れることが望ましい有効な使用例が存在しますscoped_lock。また、空の場合は何もロックしてはなりませ

これが、lock_guardが非推奨ではない理由です。scoped_lock および unique_lockは の機能のスーパーセットである可能性がありますlock_guardが、その事実は諸刃の剣です。 場合によっては、型が実行しない内容(この場合はデフォルトの構成) も同様に重要です。

おすすめ記事