读书人

apache中initialized为什么先++或-再判

发布时间: 2012-03-21 13:33:15 作者: rapoo

apache中initialized为什么先++或--再判断
这是apache的start.c里面的一段代码,这里面定义了一个initialized变量,因为是static类型也只有这两个函数可以操作这个变量。不管是init操作还是terminate操作,都是先改变了initialized的值再判断下一步的操作,这样就有个问题,如果不小心多次调用了init函数,但是terminate函数调用的次数比Init少,就会发生资源不释放的问题。都说apache的代码质量高,写成这样应该是有原因的吧。哪位大虾来说一下这个为什么要写成这样

C/C++ code
static int initialized = 0;APR_DECLARE(apr_status_t) apr_initialize(void){       apr_pool_t *pool;    apr_status_t status;    if (initialized++) {        return APR_SUCCESS;    }   #if !defined(BEOS) && !defined(OS2)    apr_proc_mutex_unix_setup_lock();    apr_unix_setup_time();#endif      if ((status = apr_pool_initialize()) != APR_SUCCESS)        return status;              if (apr_pool_create(&pool, NULL) != APR_SUCCESS) {        return APR_ENOPOOL;    }    apr_pool_tag(pool, "apr_initialize");    /* apr_atomic_init() used to be called from here aswell.     * Pools rely on mutexes though, which can be backed by     * atomics.  Due to this circular dependency     * apr_pool_initialize() is taking care of calling     * apr_atomic_init() at the correct time.     */    apr_signal_init(pool);    return APR_SUCCESS;}APR_DECLARE_NONSTD(void) apr_terminate(void){    initialized--;    if (initialized) {        return;    }    apr_pool_terminate();    }


[解决办法]
1、允许多次调用。
2、要求配对调用。
[解决办法]
这个应该是实现类似引用的功能的吧,第一次调用会初始化apache引擎,以后调用,因为apache引擎已经初始化了,所以只是++,initialized就表示引用了多少次,或者说有多少个引擎实例。
然后你每关闭一次,并不会真正关闭apache引擎,它会--,直到initialized为零,表示一个apache引擎的实例也没有了,那时引擎才可以真正关闭。

类似用这种机制的还有windows里面的COM接口调用,比如DirectX引擎

欢迎拍板~
[解决办法]
因为只有强制配对了才能保证你不会哪里有条件分支多一次少一次,这是良好的编程习惯,也方便 debug。
[解决办法]
Apache 动辄几十个模块,每个模块调用一次 initialize 调用一次 terminate 是最可靠的方法。

读书人网 >C语言

热点推荐