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

在Apache服务器中初始化全局变量,c,multithreading,apache,locking,multiprocessing,C,Multithreading,Apache,Locking,Multiprocessing,我有一个简单的ApacheWeb服务器,带有一个钩子函数和一个处理函数 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

我有一个简单的ApacheWeb服务器,带有一个钩子函数和一个处理函数

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,但是如果我想使用lock,我需要在初始化之前初始化锁 我再一次遇到了多线程系统中的初始化问题

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

提到变量初始化,我指的是任何初始化,甚至调用另一个函数来初始化全局结构。
如果我能在两个进程(hook和handler)之间共享内存,可能会容易得多,但从我所做的调查来看,这是不可能的。

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


例如:C11 threads.h或。

CallOnce函数是否提供直到调用结束的锁定?e、 例如,所有其他线程都将等待,直到CallOnce函数中的一个线程完成在CallOnce函数中的运行…您知道在init函数失败的情况下,是否有方法使用call_once函数再次调用init函数吗?找到了!使用try-catch语句。