APR 池

来源:互联网 发布:什么是贵族气质知乎 编辑:程序博客网 时间:2024/05/21 09:24

APR 池

来自:APACHE模块开发指南

APR池为资源管理提供了一个可选的模型。和垃圾回收类似,APR池将程序员从各种可能的情况下进行清理操作的复杂性中解放出来。

 

池最基本的应用就是内存管理。

可采用如下方式:

myType *myvar = apr_palloc(pool, sizeof (myType));


不管在此期间发生了什么,池将自动地负责释放这个资源(在请求介绍时)。


APR提供了用来进行内存管理内建的函数,以及一些其他的基本资源,程序员也可不使用这些APR内建的函数和资源。

如:

myType *myvar = malloc(sizeof(myType));

apr_pool_cleanup_register(pool, myvar, free, apr_pool_cleanup_null);


如果集成c++的析构函数做资源释放,APR提供下面的方法:

假设我们定义了一个类:

class myclass{

public:

  virtual ~myclass() { /* do cleanup */ }

};

我们定义一个C的封装,用于delete

void myclassCleanup(void *ptr) {delete (myclass*)ptr;}

然后我们在分配myclass时通过池注册这个封装:

myclass *myobj = new myclass();

apr_pool_cleanup_register(pool, (void *)myobj, myclassCeanup, apr_pool_cleanup_null);

则当请求介绍时,清理池时会调用封装函数。


隐士和显示地清除

class poolclass{

private:

  apr_pool_t *pool;

public:

  poolclasss(apr_pool_t* p) : poll(p){

     apr_pool_cleanup_register(pool, (void *)this, myclassCleanup, apr_pool_cleanup_null);

  };

  virtual ~poolclass(){

     apr_pool_cleanup_kill(pool, (void *)this, myclassCleanup);

  };

}

如果你使用C++开发Apache,你可以从poolclass类继承。大部分的APR函数做的和这个一样,随时在资源被分配或者清除时进行注册和清理操作。


生命周期

请求池(request pool),生命周期为HTTP请求的生命周期

进程池(process pool),生命周期为一个服务进程的生命周期

连接池(connection pool),生命周期为一个TCP连接的生命周期


0 0