c/c++语言开发共享库初始化 – Win32实现中的pthread_once

你好。 我试图为我的库创建一个完全线程安全的初始化函数,我不能轻易找到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()调用导致一个线程不安全的函数,它初始化库。

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

    我想你想使用一次性初始化function。 在同步模式下,所有线程都会阻塞,直到调用它的第一个线程完成。 似乎与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 } 

    您可能想要检查pthreads-win32在其pthread_once()实现中的作用。 或者只是使用它,如果事实certificate更容易。

    在查看了pthread_once()的以下源代码(从这里开始 )之后,看起来你正走在正确的轨道上。

      int pthread_once(pthread_once_t * once_control,void(* init_routine)(void))  {      / *首先检查速度* /      if(once_control-> state == PTHREAD_NEEDS_INIT){         的pthread_mutex_lock(&(once_control->互斥));          if(once_control-> state == PTHREAD_NEEDS_INIT){              init_routine();              once_control-> state = PTHREAD_DONE_INIT;          }         调用pthread_mutex_unlock(&(once_control->互斥));      }     回报(OK);  } 

    顺便说一句,我将使用pthread_once()替换我的代码中一些相当复杂的函数。

    使用GCC或clang时,可以使用构造函数和析构函数属性。 这些工作分别用于共享库和静态库,并分别在main运行之前和之后执行代码。 此外,您可以指定多个构造函数和析构函数。 比单例方法更清晰,并且不需要你记得从main()调用libInit()。

     static void __attribute__((constructor)) your_lib_init(void) { fprintf(stderr, "library initn"); } static void __attribute__((destructor)) vensim_ctx_destroy(void) { fprintf(stderr, "library destroyn"); } 

    我会查看这篇文章。 它是C ++单例的解决方案,但我相信您也可以使用该解决方案代码: http : //www.ddj.com/cpp/199203083?pgno = 1

    可悲的是,QLock本身的上市缺失了,看起来好像他们正试图出售CD,但似乎有足够的描述来自己写一个。

      以上就是c/c++开发分享库初始化 – Win32实现中的pthread_once相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562406.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐