RAII(Resource Acquisition Is Initialization)

RAII(Resource Acquisition Is Initialization)

Content #

RAII(Resource Acquisition Is Initialization,资源获取就是初始化),是 C++ 中的一个利用了面向对象的技术。这个设计模式叫“代理模式”。我们可以把一些控制资源分配和释放的逻辑交给这些代理类,然后,只需要关注业务逻辑代码了。而且,在我们的业务逻辑代码中,减少了这些和业务逻辑不相关的程序控制的代码。

mutex m;
void foo() {
    m.lock();
    Func();
    if ( ! everythingOk() ) return;
    ...
    ...
    m.unlock();
}

可以看到,上面这段代码是有问题的,原因是:那个 if 语句返回时没有把锁给 unlock 掉,这会导致锁没有被释放。如果我们要把代码写对,需要在 return 前 unlock 一下。

mutex m;
void foo() {
    m.lock();
    Func();
    if ( ! everythingOk() ) {
        m.unlock();
        return;
    }
    ...
    m.unlock();
}

但是,在所有的函数退出的地方都要加上 m.unlock(); 语句,这会让我们很难维护代码。于是可以使用面向对象的编程模式,我们先设计一个代理类。

class lock_guard {
  private:
    mutex &_m;
  public:
    lock_guard(mutex &m):_m(m) { _m.lock(); }
    ~lock_guard() { _m.unlock(); }
};

然后,我们的代码就可以这样写了:

mutex m;
void foo() {
  lock_guard guard(m);
  Func();
  if ( ! everythingOk() ) {
    return;
  }
  ...
}

From #