我有一个带有 Hook 函数和处理程序函数的简单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;
}

我注意到,当我在 Hook 中初始化globalVar1时,该变量的值与在 Hook 中初始化的值相同,
尽管钩子(Hook)和处理程序是在不同的进程上调用的。

1.这种行为的原因是什么?

结果,我决定将变量初始化移至处理程序函数(globalVar2)。
我注意到的问题是在处理程序同时获得2个请求时发生的,因此该变量未正确初始化。
因此,如果要避免出现竞争状况,则需要在变量初始化上使用锁,但是如果要使用锁,则需要在变量初始化之前进行初始化
再次,我有在多线程系统中初始化的问题。

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

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

最佳答案

要确保在多线程情况下初始化仅执行一次,请使用函数CallOnce,该函数在内部确保仅将其调用一次。

例如:C11threads.h call_oncepthread_once

10-08 04:46