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 是最可靠的方法。