是否可以静态初始化CRITICAL_SECTION
,如pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
?
换句话说,是否可以在C中初始化库中的全局CRITICAL_SECTION
而不必混淆DllMain
等。
答案 0 :(得分:1)
是的!但是你必须确保每个进程只执行一次。
但这通常是使用DLLMain的DLL_PROCESS_ATTACH情况最容易实现的
switch( fdwReason )
声明。
答案 1 :(得分:1)
是的,只需在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.
}
<强>参考文献:强>
答案 2 :(得分:0)
Raymond Chen的上述答案解决了这个问题:“你可以使用InitOnceExecuteOnce在首次使用时初始化关键部分。这就是PTHREAD_MUTEX_INITIALIZER
所做的事情。”
请注意,这仅适用于Vista及以上版本--- @rkosegi
您可以通过writing your own
InitOnceExecuteOnce
function usingInterlockedCompareExchange
为旧版本的Windows执行此操作。 --- @RaymondChen
答案 3 :(得分:0)
早期版本的另一种可能性是指示链接器将指向初始化函数的指针设置为用户定义的全局初始化程序。这里有一些讨论:
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;