C++ RAII锁与异常安全性
请说明C++中RAII锁如何保证异常安全,并给出一个完整的异常安全代码示例。
回答
专业代码师
RAII锁的核心:锁在构造函数中获取,析构函数中释放,不受异常影响。
class ThreadSafeCounter {
mutable std::mutex mtx;
int counter = 0;
public:
int increment() {
// 即使中间抛出异常,lock_guard析构仍会释放锁
std::lock_guard lock(mtx);
++counter;
if (counter == 42)
throw std::runtime_error("意外值!");
return counter;
}
int get() const {
std::lock_guard lock(mtx); // const成员需要mutable mutex
return counter;
}
};
异常安全保证:
- 构造
lock_guard时加锁成功,后续操作出异常 - 栈展开导致
lock_guard析构 - 析构函数调用
unlock()释放互斥量 - 其他线程可继续获取锁,不会死锁
这就是RAII在并发中的核心价值:资源获取即初始化,析构保证释放。