当前位置:  开发笔记 > 程序员 > 正文

库初始化 - Win32实现中的pthread_once

如何解决《库初始化-Win32实现中的pthread_once》经验,为你挑选了1个好方法。

你好.我试图为我的库创建一个完全线程安全的初始化函数,我不能轻易找到pthread_once的替代品,这应该很容易解决问题.我来这个代码:

void libInit (void)
{
#ifdef WIN32
    static volatile int initialized = 0;
    static HANDLE mtx;

    if (!initialized)
    {
        if (!mtx)
        {
            HANDLE mymtx;
            mymtx = CreateMutex(NULL, 0, NULL);
            if (InterlockedCompareExchangePointer(&mtx, mymtx, NULL) != NULL)
                CloseHandle(mymtx);
        }

        WaitForSingleObject(mtx);
        if (!initialized)
        {
            libInitInternal();
            initialized = 1;
        }
        ReleaseMutex(mtx);
    }
#else
    static pthread_once_t initialized = PTHREAD_ONCE_INIT;

    pthread_once(&initialized, libInitInternal);
#endif
}

libInitInternal()调用导致线程安全的功能,即初始化库.

我想听听有关我可能做错的建议或是否了解更好的解决方案.



1> i_am_jorf..:

我想你想使用一次性初始化功能.在同步模式下,所有线程都会阻塞,直到调用它的第一个线程完成.似乎与pthread_once()类似.

这里有示例代码.

所以在你的情况下,你会说:

BOOL CALLBACK CallLibInitInternal(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex) {
    libInitInternal();
    return TRUE;
}

void libInit() {
#ifdef WIN32
    static INIT_ONCE s_init_once;
    InitOnceExecuteOnce(&s_init_once, CallLibInitInternal, NULL, NULL);
#else
...
#endif
}

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有