是否可以CRITICAL_SECTION
静态初始化,如pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
?
换句话说,是否可以在 C 中初始化CRITICAL_SECTION
库中的全局变量而不必搞乱DllMain
等?
是否可以CRITICAL_SECTION
静态初始化,如pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
?
换句话说,是否可以在 C 中初始化CRITICAL_SECTION
库中的全局变量而不必搞乱DllMain
等?
是的!但是您必须确保每个进程只执行一次。但这通常最容易通过使用 DLLMain
switch( fdwReason )
语句的 DLL_PROCESS_ATTACH 案例来实现。
是的,只需在 DLL_PROCESS_ATTACH 中初始化并在 DLL_PROCESS_DETACH 中删除
CRITICAL_SECTION g_cs = {0};
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
InitializeCriticalSection(&g_cs);
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
DeleteCriticalSection(&g_cs);
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
参考:
Raymond Chen 的上述回答解决了这个问题:“您可以使用 InitOnceExecuteOnce 在首次使用时初始化临界区。这就是幕后的PTHREAD_MUTEX_INITIALIZER
工作。”
请注意,这仅适用于 Vista 及更高版本 --- @rkosegi
您
InitOnceExecuteOnce
InterlockedCompareExchange
可以通过使用. --- @RaymondChen
早期版本中的另一种可能性是指示链接器将指向初始化函数的指针设置为用户定义的全局初始化程序。这里有一些讨论:
http://msdn.microsoft.com/en-us/library/bb918180.aspx
这是一个例子:
CRITICAL_SECTION criticalSection;
static void __cdecl Initialize(void) {
InitializeCriticalSection(&criticalSection);
}
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU"))
const void (__cdecl *pInitialize)(void) = Initialize;