C++11——RAII 锁封装类
C++ 并发编程中“封装锁机制的智能 RAII 类(Resource Acquisition Is Initialization)”是多线程安全的关键组件。它们的核心思想是:利用对象的构造和析构自动完成加锁与解锁,防止因忘记解锁导致的死锁或未定义行为。

一、std::lock_guard
特点:
构造时自动加锁;
析构时自动解锁;
无法手动解锁或延迟加锁;
性能最好(零开销封装)。
适合场景:
临界区短小、逻辑简单的加锁保护。
#include <mutex>std::mutex mtx;void safe_increment() {std::lock_guard<std::mutex> guard(mtx);// 临界区
}
二、std::unique_lock
项目里面用到
std::unique_lock<std::mutex> lock(_mutex);
这行代码的作用是:
创建一个
std::unique_lock对象lock,并立即对_mutex进行加锁(lock)。在
lock对象的生命周期内,互斥量_mutex会保持上锁状态;当lock对象析构(超出作用域)时,互斥量会自动解锁(unlock)。
功能最强、最灵活的锁封装类。
特点:
可延迟加锁:
std::unique_lock<std::mutex> lock(mtx, std::defer_lock);可提前解锁、重新上锁:
lock.unlock(); lock.lock();可与
std::condition_variable配合;支持所有权转移(可移动不可复制)。
适合场景:
需要灵活控制锁行为、等待条件变量时。
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void wait_task() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return ready; }); // 自动解锁、等待、再上锁
}
三、std::shared_lock
特点:
与
std::shared_mutex或std::shared_timed_mutex搭配;多个线程可同时持有
shared_lock共享读;写线程使用
unique_lock独占访问 单独写;支持延迟加锁、超时加锁、解锁重锁。
适合场景:
读多写少的共享数据(例如缓存或查询系统)。
#include <shared_mutex>std::shared_mutex smtx;void reader() {std::shared_lock<std::shared_mutex> lock(smtx);// 可并发读
}void writer() {std::unique_lock<std::shared_mutex> lock(smtx);// 独占写
}
四、std::scoped_lock(C++17)
同时锁多个互斥量的安全封装器。
特点:
可同时锁住多个 mutex;
自动采用防死锁策略;
析构时自动全部解锁;
不支持解锁再上锁。
适合场景:
函数中需要同时操作多个共享资源。
#include <mutex>std::mutex m1, m2;void safe_func() {std::scoped_lock lock(m1, m2); // 同时加锁,防止死锁
}
