こんにちは。ライブラリに完全にスレッドセーフな初期化関数を作成しようとしていますが、問題を非常に簡単に解決できる 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()
呼び出しは、ライブラリを初期化するスレッドセーフでない関数につながります。
私が間違っている可能性があること、またはより良い解決策を知っているかどうかについての提案を聞きたいです。