如何保护基于 C 的库的 init 函数?

发布于 2024-09-15 17:46:38 字数 227 浏览 3 评论 0原文

我编写了一个基于 C 的库,为了使其能够多线程并行工作,我在 init 函数中创建了一些全局互斥体。

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

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

I have written a C based library and for it to work in multi-thread parallely, I create some global mutexes in the init function.

I expect the init function to be called in the main thread before the library APIs are used in multi-thread.

But, if the init function itself is called in multi-thread directly, then it is a problem. Is there a way to protect the init function itself from my library? One way I can think of is to ask the application to create a mutex and protect parallel calls to my init function, but can I protect it from my library itself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

以往的大感动 2024-09-22 17:46:44

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. */
}

POSIX has the pthread_once function

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

In the linux man page they then have the following instructive example

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. */
}
美煞众生 2024-09-22 17:46:42

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

在 Windows 中,您可以使用 DllMain 来创建和销毁互斥体。

在 Linux 和可能其他一些 Unix 上,您可以在入口和出口函数上使用 __attribute__((constructor)) 和 __attribute__((destructor)) 。

在这两种情况下,函数将在加载和卸载时调用一次

You probably want to use teh default entry point functions.

In windows you can use DllMain to create and destroy your mutexes.

On Linux and probably some other Unixes you can use __attribute__((constructor)) and __attribute__((destructor)) on your entry and exit functions.

In both these case, the functions will be called once on load and unload

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文