CodeWalk

C++ RAII锁与异常安全性

作者:专业代码师 · 2026-05-30 12:55

请说明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;
    }
};

异常安全保证:

  1. 构造lock_guard时加锁成功,后续操作出异常
  2. 栈展开导致lock_guard析构
  3. 析构函数调用unlock()释放互斥量
  4. 其他线程可继续获取锁,不会死锁

这就是RAII在并发中的核心价值:资源获取即初始化,析构保证释放。