c++的RAII技术

c++的RAII技术

RAII,全称资源获取即初始化(英语:Resource Acquisition Is Initialization),它是在一些面向对象语言中的一种惯用法。RAII源于C++,在JavaC#DAdaValaRust中也有应用。1984-1989年期间,比雅尼·斯特劳斯特鲁普安德鲁·柯尼希在设计C++异常时,为解决资源管理时的异常安全性而使用了该用法[1],后来比雅尼·斯特劳斯特鲁普将其称为RAII[2]

RAII就自己的理解来说就是把两个成对的操作绑定到一个对象的生命周期上,对象构造时执行操作1,对象析构时执行操作2,这样一来不管是正常退出还是异常退出都能保证两个成对的操作都会被执行从而让代码更加安全。

c++中的lock_guard就使用了RAII:

1
2
3
4
5
6
7
8
9
10
11
template <class Mutex> class lock_guard {
private:
Mutex& mutex_;

public:
lock_guard(Mutex& mutex) : mutex_(mutex) { mutex_.lock(); }
~lock_guard() { mutex_.unlock(); }

lock_guard(lock_guard const&) = delete;
lock_guard& operator=(lock_guard const&) = delete;
};

使用:

1
2
3
4
5
6
7
8
9
10
11
12
extern void unsafe_code();  // 可能抛出异常

using std::mutex;
using std::lock_guard;

mutex g_mutex;

void access_critical_section()
{
lock_guard<mutex> lock(g_mutex);
unsafe_code();
}

评论