首页 > 后端开发 > C++ > 正文

c++中std::lock_guard和std::unique_lock的区别_c++锁机制使用对比

冰火之心
发布: 2025-10-13 15:50:01
原创
326人浏览过
std::lock_guard适用于简单场景,构造时加锁、析构时解锁,不支持手动控制;std::unique_lock更灵活,支持延迟加锁、手动加解锁、条件变量配合及所有权转移,适合复杂控制需求。多数情况下优先使用轻量的std::lock_guard。

c++中std::lock_guard和std::unique_lock的区别_c++锁机制使用对比

在C++多线程编程中,std::lock_guardstd::unique_lock 都是用来管理互斥量(mutex)的RAII(资源获取即初始化)类,确保在作用域结束时自动释放锁。虽然功能相似,但它们在灵活性和使用场景上有明显区别

1. 基本用途与设计目标

std::lock_guard 是最简单的锁管理工具,设计目标是提供最小化、高效且不可手动控制的锁机制。它在构造时加锁,析构时解锁,不支持中途释放或重新获取锁。

std::unique_lock 更加灵活,除了具备 lock_guard 的基本RAII功能外,还支持延迟加锁、手动加锁/解锁、条件变量配合使用以及锁所有权的转移。

2. 是否支持手动加锁与解锁

lock_guard 一旦创建就立即持有锁,直到对象销毁,期间无法主动释放锁。

立即学习C++免费学习笔记(深入)”;

  • lock_guard 不提供 lock() 或 unlock() 成员函数
  • 适用于简单作用域内全程需要锁的场景

unique_lock 支持更细粒度的控制:

  • 可以构造时不加锁:std::unique_lock<std::mutex> ulk(mutex, std::defer_lock)
  • 可手动调用 ulk.lock()ulk.unlock()
  • 适合锁只在部分代码段需要的场景

3. 与条件变量的配合使用

只有 std::unique_lock 可以作为参数传递给 std::condition_variable::wait()

这是因为条件变量在等待时需要临时释放锁,并在被唤醒后重新获得锁,这种“释放-阻塞-重获”机制要求锁对象支持移动和手动控制,而 unique_lock 正好满足。

Calliper 文档对比神器
Calliper 文档对比神器

文档内容对比神器

Calliper 文档对比神器 28
查看详情 Calliper 文档对比神器

示例:

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

// 等待线程
std::unique_lock<std::mutex> lk(mtx);
cv.wait(lk, []{ return ready; });
登录后复制

4. 性能与开销对比

由于 unique_lock 提供了更多功能,其内部状态比 lock_guard 更复杂,可能包含是否已加锁的标志位,因此有轻微的性能开销。

  • lock_guard:轻量、高效,无额外状态
  • unique_lock:稍重,但大多数场景下性能差异可忽略

建议:如果只是保护一段临界区且不需要延迟加锁或配合条件变量,优先使用 lock_guard。

5. 锁的所有权转移

unique_lock 支持移动语义,可以将锁的所有权从一个 unique_lock 对象转移到另一个,这在函数返回锁或封装锁逻辑时非常有用。

lock_guard 不可复制也不可移动,锁的作用域严格绑定在其声明的作用域内。

基本上就这些。选择哪个取决于需求:追求简洁安全用 lock_guard,需要灵活控制用 unique_lock。不复杂但容易忽略的是,很多开发者一开始都用 unique_lock,其实多数场景 lock_guard 更合适。

以上就是c++++中std::lock_guard和std::unique_lock的区别_c++锁机制使用对比的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号