繁体   English   中英

Apache模块中的静态变量是否要初始化一次?

[英]Static Variables in Apache module are initialized more then once?

我为Apache HTTP服务器编写了一个模块,发现了奇怪的行为。 我假设静态变量仅初始化一次,但是我在下面编写了代码,并向Apache发出了两个请求,输出为:


test_handler: isInit=0
test_handler: isInit=1

test_handlere: isInit=0
test_handlere: isInit=1

测试代码:


static int isInit = 0;

static int test_handler( request_rec *r ) {
    fprintf(stderr,"\n\natest_handler: isInit=%d", isInit );
    if( !isInit ) {
        isInit = 1;
    }
    fprintf(stderr,"\natest_handler: isInit=%d", isInit );
    fflush(stderr);
    return DECLINED;
}

static void register_hooks(apr_pool_t *p) {
    fprintf(stdout,"register_hooks\n"); 
    ap_hook_translate_name(test_handler, NULL, NULL, APR_HOOK_FIRST);    
    fprintf(stdout,"register_hooks done\n");
}

module AP_MODULE_DECLARE_DATA test_module = {
    STANDARD20_MODULE_STUFF, 
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge  per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge  per-server config structures */
    NULL,                  /* table of config file commands       */
    register_hooks  /* register hooks                      */
};

这个问题与线程有关,因为当我向Apache发出10个请求时,我看到isInit=1, isInit=1在某些情况下为isInit=1, isInit=1在其他情况下为isInit=0, isInit=1

我的问题是, 如何定义一个变量,该变量将在test_handler()访问,并在调用函数之间保留其值?

我认为,我发现了问题。 适用于Linux的Apache服务器创建了多个“子”服务器来服务并行请求。 每个虚拟服务器都会加载配置,包括模块实例,因此,如果ApacheServer创建8个子服务器进程,则需要8个isInit变量副本。 您可以将Apache配置为仅创建一台服务器(不推荐-性能)。 另一种方法是将Apache Server配置为使用其他Multi-Proccess技术,我读过abot prefork和worker。 根据Windows上的Apache2文档,服务器使用Windows API,因此您可以迁移到Windows或编写可用作多个并行实例的模块。

我认为这可能与多个线程同时运行时发生的竞争状况有关。 关键字static是仅限制变量的范围,因此它不是解决方案-出于竞争条件排除的目的,请使用mutexes之类的东西。 说到在连接内的函数调用之间保留一些变量,您需要将此变量存储在与连接相关的结构中(例如,请参见request_rec->notesrequest_rec->connection->notes )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM