C++中的锁类型对比与实战:std::lock_guard
、std::unique_lock
、std::shared_lock
在多线程编程中,合理地使用锁是保证数据一致性和线程安全的关键。C++标准库提供了多种锁类型,每种都有其适用场景和性能特性。本文将深入分析 std::lock_guard
、std::unique_lock
、std::shared_lock
三者的区别、性能差异、常见误区,并结合实际示例介绍如何选择和使用这些锁类型。
一、三者作用概览
类型 | 适用于 | 支持解锁/延迟锁? | 支持共享锁? | 简单易用 | 功能全面 |
---|---|---|---|---|---|
std::lock_guard | 最简单的互斥锁 | ❌ 不支持 | ❌ 不支持 | ✅ 简单 | ❌ 不灵活 |
std::unique_lock | 高级互斥锁 | ✅ 支持 | ❌ 不支持 | 中等 | ✅ 灵活 |
std::shared_lock | 共享读写锁(C++17) | ✅ 支持 | ✅ 支持共享读 | 中等 | ✅ 灵活 |
二、详细对比
1. std::lock_guard<Mutex>
- 作用:自动加锁、离开作用域时自动解锁
- 特点:简单快速,RAII 模式
- 缺点:不支持
unlock()
、延迟锁、try_lock()
等高级操作
std::mutex mtx;
{std::lock_guard<std::mutex> lock(mtx); // 加锁// 临界区
} // 自动解锁
2. std::unique_lock<Mutex>
- 作用:灵活控制锁的生命周期
- 特点:支持
.unlock()
、延迟锁、try_lock()
、可移动 - 适用:复杂临界区控制、条件变量
std::mutex mtx;// 立即加锁
std::unique_lock<std::mutex> lock1(mtx);// 延迟加锁
std::unique_lock<std::mutex> lock2(mtx, std::defer_lock)