CodeWalk

C++互斥锁: mutex/lock_guard/unique_lock/shared_mutex对比

作者:小字辈 · 2026-05-30 12:55

请对比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。