在 Apache 服务器中初始化全局变量
Initialize global variable in Apache server
我有一个带有挂钩函数和处理程序函数的简单 Apache Web 服务器。
int globalVar1;
int globalVar2;
static void register_hooks(apr_pool_t *pool)
{
globalVar1 = 9; /* or any other value... */
/* Create a hook in the request handler, so we get called when a request arrives */
ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
}
static int example_handler(request_rec *r)
{
printf("globalVar1=%d", globalVar1); /* print 9 */
globalVar2 = 9; /* or any other value... */
printf("globalVar2=%d", globalVar2); /* sometimes print 9 and sometimes not - race condition. */
/* do something... */
return OK;
}
我注意到当我在钩子中初始化 globalVar1 时,该变量与我在钩子中初始化的值相同,
虽然钩子和处理程序是在不同的进程上调用的。
1.这种行为的原因是什么?
因此,我决定将变量初始化移到处理函数中(globalVar2
)。
我注意到的问题是当处理程序同时收到 2 个请求时发生的,因此变量没有被正确初始化。
所以如果我想避免竞争条件,我需要在变量初始化上使用锁,但是如果我想使用锁,我需要在初始化锁之前
我又遇到了多线程系统中的初始化问题。
2。在这种情况下如何使用锁?
我所说的变量初始化是指任何初始化,甚至调用另一个函数来初始化全局结构。
如果我可以在两个进程(挂钩和处理程序)之间共享内存,那可能会容易得多,但从我所做的调查来看——这是不可能的。
要确保在多线程情况下只进行一次初始化,请使用函数 CallOnce,它在内部确保只调用一次。
例如:C11 threads.h call_once, or pthread_once.
我有一个带有挂钩函数和处理程序函数的简单 Apache Web 服务器。
int globalVar1;
int globalVar2;
static void register_hooks(apr_pool_t *pool)
{
globalVar1 = 9; /* or any other value... */
/* Create a hook in the request handler, so we get called when a request arrives */
ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST);
}
static int example_handler(request_rec *r)
{
printf("globalVar1=%d", globalVar1); /* print 9 */
globalVar2 = 9; /* or any other value... */
printf("globalVar2=%d", globalVar2); /* sometimes print 9 and sometimes not - race condition. */
/* do something... */
return OK;
}
我注意到当我在钩子中初始化 globalVar1 时,该变量与我在钩子中初始化的值相同, 虽然钩子和处理程序是在不同的进程上调用的。
1.这种行为的原因是什么?
因此,我决定将变量初始化移到处理函数中(globalVar2
)。
我注意到的问题是当处理程序同时收到 2 个请求时发生的,因此变量没有被正确初始化。
所以如果我想避免竞争条件,我需要在变量初始化上使用锁,但是如果我想使用锁,我需要在初始化锁之前
我又遇到了多线程系统中的初始化问题。
2。在这种情况下如何使用锁?
我所说的变量初始化是指任何初始化,甚至调用另一个函数来初始化全局结构。 如果我可以在两个进程(挂钩和处理程序)之间共享内存,那可能会容易得多,但从我所做的调查来看——这是不可能的。
要确保在多线程情况下只进行一次初始化,请使用函数 CallOnce,它在内部确保只调用一次。
例如:C11 threads.h call_once, or pthread_once.