考虑 std::lock_guard 与 std::scoped_lock
C 17 标志着引入了一个新颖的锁类 std::scoped_lock ,它与古老的 std::lock_guard 有相似之处。本文深入探讨了这两种锁定机制之间的区别,指导您选择适合您特定需求的最佳工具。
何时使用 std::lock_guard
For在需要锁定整个作用域的单个互斥体的情况下,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 ... }
这段代码在块的持续时间内简洁地锁定了两个互斥锁。
结论
std::lock_guard 和 std::scoped_lock 都满足不同的场景:
虽然 std::scoped_lock 提供了更全面的功能,但 std::lock_guard 在特定情况下提供了增强的 API 安全性。选择最合适的方法时,请仔细考虑代码的要求。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3