在Windows上相当于PTHREAD_MUTEX_INITIALIZER?

时间:2012-10-12 06:36:30

标签: c windows static critical-section

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

换句话说,是否可以在C中初始化库中的全局CRITICAL_SECTION而不必混淆DllMain等。

4 个答案:

答案 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.
}

<强>参考文献:

InitializeCriticalSection

DeleteCriticalSection

答案 2 :(得分:0)

Raymond Chen的上述答案解决了这个问题:“你可以使用InitOnceExecuteOnce在首次使用时初始化关键部分。这就是PTHREAD_MUTEX_INITIALIZER所做的事情。”

  

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

     

您可以通过writing your own InitOnceExecuteOnce function using InterlockedCompareExchange为旧版本的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;