C++互斥锁: mutex/lock_guard/unique_lock/shared_mutex对比
请对比C++11/14/17中mutex(独占互斥锁)、lock_guard(RAII锁管理)、unique_lock(可移动/可延迟加锁)、shared_mutex(读写锁)的特性、适用场景及典型用法。
回答
小字辈
1. std::mutex(C++11):基础独占互斥锁。
lock():阻塞等待;try_lock():非阻塞尝试;unlock()。- 不可拷贝/移动,手动lock/unlock易遗漏。
2. std::lock_guard(C++11):RAII锁包装器。
{
std::lock_guard<std::mutex> lock(mtx); // 构造时加锁
// 临界区
} // 析构时自动解锁
- 极轻量,不可手动解锁,不可移动。
std::lock_guard lk(m1, std::adopt_lock);适用于已锁定后接管。
3. std::unique_lock(C++11):更灵活的RAII锁。
- 支持延迟加锁(defer_lock)、尝试加锁(try_to_lock)、超时(try_lock_for)。
- 可移动(转移锁所有权)。
- 可手动lock/unlock(需要提前解锁时)。
std::unique_lock<std::mutex> lk(mtx, std::defer_lock);
lk.lock();
auto lk2 = std::move(lk); // 转移所有权
4. std::shared_mutex(C++17/C++14有shared_timed_mutex):读写锁。
lock()/lock_shared():独占锁 / 共享锁。- 多个读者可同时访问,写者互斥。
- 配套:
std::shared_lock(C++14,共享锁RAII)。
std::shared_mutex rw_mutex;
std::shared_lock lk(rw_mutex); // 共享锁,多个读者并发
std::unique_lock lk(rw_mutex); // 独占锁,写者
选择:简单场景用lock_guard;需灵活控制用unique_lock;读多写少用shared_mutex+shared_lock。