在Apache服务器中初始化全局变量

时间:2016-01-31 12:42:37

标签: c multithreading apache locking multiprocessing

我有一个简单的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个请求时发生,因此变量未正确初始化。 所以如果我想避免竞争条件,我需要对变量初始化使用锁,但是如果我想使用lock,我需要在之前初始化锁 我再次遇到多线程系统初始化的问题。

2。在这种情况下如何使用锁?

通过提及变量初始化,我的意思是任何初始化,甚至调用另一个函数来初始化全局结构。 如果我可以在两个进程(钩子和处理程序)之间共享内存可能会容易得多,但是从我做过的调查 - 这是不可能的。

1 个答案:

答案 0 :(得分:2)

要确保在多线程情况下只进行一次初始化,请使用CallOnce函数,在内部确保只调用一次。

例如:C11 threads.h call_oncepthread_once