代码之家  ›  专栏  ›  技术社区  ›  Jay

如何保护C库的init函数?

  •  2
  • Jay  · 技术社区  · 15 年前

    我已经编写了一个基于C的库,为了使它在多线程并行环境中工作,我在init函数中创建了一些全局互斥。

    我希望在多线程中使用库api之前,在主线程中调用init函数。

    但是,如果init函数本身是在多线程中直接调用的,那么这就是一个问题。有没有办法保护init函数本身不受我的库的影响?我能想到的一种方法是要求应用程序创建一个互斥锁并保护对init函数的并行调用,但是我能保护它不受库本身的影响吗?

    2 回复  |  直到 15 年前
        1
  •  5
  •   doron    15 年前

    您可能想使用默认的入口点函数。

    在windows中可以使用 DllMain 创建和销毁互斥锁。

    __attribute__((constructor)) __attribute__((destructor)) 进入和退出功能。

        2
  •  2
  •   Jens Gustedt    15 年前

    POSIX拥有 pthread_once

    int pthread_once(pthread_once_t *once_control,
                  void (*init_routine)(void));
    

    在linux手册页中,他们有以下有指导意义的例子

    static pthread_once_t random_is_initialized = PTHREAD_ONCE_INIT;
    extern int initialize_random();
    
    int random_function()
    {
     (void) pthread_once(&random_is_initialized, initialize_random);
                  ... /* Operations performed after initialization. */
    }