Hello. Kitaplığım için tam olarak güvenli bir başlatma işlevi yapmaya çalışıyorum ve pthread_once'a kolayca çözüm bulamayan bir alternatif bulamadım. Bu kod geldiniz:Kitaplık başlatması - Win32 uygulamasında 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()
çağrı kütüphane başlatır bir iş parçacığı güvenli olmayan fonksiyonu yol açar.
Neyi yanlış yaptığımı veya daha iyi bir çözüm olup olmadığını öğrenmek için herhangi bir öneri duymak isterim.
Bu bir statik kitaplık veya dll mi? – grieve
Bu bir DLL değil. DLL'ler için bir başlatma işlevi olduğunu biliyorum ama istediğim bu değil. –