Überlegungen zu std::lock_guard vs. std::scoped_lock
C 17 markierte die Einführung einer neuartigen Sperrklasse, std::scoped_lock , das Ähnlichkeiten mit dem ehrwürdigen std::lock_guard aufweist. Dieser Artikel befasst sich mit den Unterschieden zwischen diesen beiden Verriegelungsmechanismen und unterstützt Sie bei der Auswahl des optimalen Werkzeugs für Ihre spezifischen Anforderungen.
Wann Sie std::lock_guard verwenden sollten
Für In Szenarien, in denen Sie das Sperren eines einzelnen Mutex für den gesamten Bereich benötigen, bietet std::lock_guard eine sicherere API als std::scoped_lock. Betrachten Sie das folgende Beispiel:
{ std::scoped_lock lock; // protect this block ... }
Dieses Snippet führt versehentlich zu einem Laufzeitfehler, da es zu „unsichtbarem Verhalten“ führt. Es scheint reibungslos zu kompilieren, führt aber letztendlich zu keiner Sperrung. Die beabsichtigte Funktionalität erforderte wahrscheinlich:
{ std::scoped_lock lock{mut}; // protect this block ... }
Die Klärung des Zielmutex zum Sperren behebt dieses Problem. Umgekehrt würde die Verwendung von std::lock_guard die Kompilierung des ersten Beispiels verhindern und es zu einem eindeutigen Fehler bei der Kompilierung machen.
Wann sollte std::scoped_lock verwendet werden
Wann Konfrontiert mit Situationen, in denen mehrere Mutexe gesperrt werden müssen, glänzt std::scoped_lock. Zum Beispiel:
{ std::scoped_lock(lock1, lock2); // protect this block ... }
Dieses Snippet sperrt kurz und bündig zwei Mutexe für die Dauer des Blocks.
Fazit
Sowohl std::lock_guard als auch std::scoped_lock sorgen dafür zu unterschiedlichen Szenarien:
Während std::scoped_lock umfassendere Funktionen bietet, std: :lock_guard bietet in bestimmten Fällen eine verbesserte API-Sicherheit. Berücksichtigen Sie sorgfältig die Anforderungen Ihres Codes, wenn Sie den am besten geeigneten Ansatz auswählen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3