std::lock_guard と std::scoped_lock の比較を検討する
C 17 では、新しいロック クラス std::scoped_lock が導入されました。 、これは由緒ある std::lock_guard と類似点を共有します。この記事では、これら 2 つのロック メカニズムの違いについて詳しく説明し、特定のニーズに合わせて最適なツールを選択できるようにガイドします。
std::lock_guard を使用する場合
スコープ全体に対して単一のミューテックスのロックが必要なシナリオでは、std::lock_guard は std::scoped_lock よりも安全な API を提供します。次の例を考えてみましょう:
{ std::scoped_lock lock; // protect this block ... }
このスニペットは「目に見えない動作」を行っているため、誤って実行時エラーが発生します。スムーズにコンパイルされているように見えますが、最終的にはロックが発生しません。意図した機能が必要と考えられます:
{ std::scoped_lock lock{mut}; // protect this block ... }
ロックのターゲット ミューテックスを明確にすることで、この問題は解決されます。逆に、std::lock_guard を採用すると、最初の例はコンパイルできなくなり、明らかなコンパイル時エラーが発生します。
std::scoped_lock を使用する場合
複数のミューテックスをロックする必要がある状況に直面した場合、std::scoped_lock が役立ちます。例:
{ std::scoped_lock(lock1, lock2); // protect this block ... }
このスニペットは、ブロック期間中 2 つのミューテックスを簡潔にロックします。
結論
std::lock_guard とstd::scoped_lock は、さまざまなシナリオに対応します。
std::scoped_lock はより包括的な機能を提供しますが、std::lock_guard は特定の場合に強化された API の安全性を提供します。最も適切なアプローチを選択するときは、コードの要件を慎重に検討してください。
以上がstd::lock_guard と std::scoped_lock: いつどちらを選択するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。