1

是否可以CRITICAL_SECTION静态初始化,如pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

换句话说,是否可以在 C 中初始化CRITICAL_SECTION库中的全局变量而不必搞乱DllMain等?

4

4 回答 4

1

是的!但是您必须确保每个进程只执行一次。但这通常最容易通过使用 DLLMain switch( fdwReason )语句的 DLL_PROCESS_ATTACH 案例来实现。

于 2012-10-12T09:54:38.813 回答
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.
}

参考:

InitializeCriticalSection

删除关键部分

于 2012-10-12T12:20:33.017 回答
0

Raymond Chen 的上述回答解决了这个问题:“您可以使用 InitOnceExecuteOnce 在首次使用时初始化临界区。这就是幕后的PTHREAD_MUTEX_INITIALIZER工作。”

请注意,这仅适用于 Vista 及更高版本 --- @rkosegi

InitOnceExecuteOnceInterlockedCompareExchange可以通过使用. --- @RaymondChen

于 2012-10-15T05:56:16.243 回答
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;
于 2014-08-03T07:06:34.297 回答