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(lock1, lock2); // このブロックを保護する ... }このスニペットは、ブロック期間中 2 つのミューテックスを簡潔にロックします。
結論{ std::scoped_lock(lock1, lock2); // protect this block ... }
std::lock_guard と std::scoped_lock の両方に対応します。個別のシナリオへ:
std::lock_guard はスコープ全体で単一のミューテックスをロックします。
std::scoped_lock は複数のミューテックスをロックするか、囲まれたスコープ内でロックを解除します。免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3