C 等同于Windows上的PTHREAD_MUTEX_初始值设定项?

C 等同于Windows上的PTHREAD_MUTEX_初始值设定项?,c,windows,static,critical-section,C,Windows,Static,Critical Section,是否可以静态初始化CRITICAL\u部分,如pthread\u mutex\u t mutex=pthread\u mutex\u初始化器 换句话说,在C语言中,是否可以在库中初始化全局关键部分,而不必处理DllMain等!但您必须确保每个进程只执行一次。 但这通常最容易通过使用DLLMain的DLL\u进程\u连接情况来实现 switch(fdreason)语句。是,只需在DLL\u进程中初始化,然后在DLL\u进程中附加和删除 CRITICAL_SECTION g_cs = {0}; B

是否可以静态初始化
CRITICAL\u部分
,如
pthread\u mutex\u t mutex=pthread\u mutex\u初始化器


换句话说,在C语言中,是否可以在库中初始化全局
关键部分
,而不必处理
DllMain
等!但您必须确保每个进程只执行一次。 但这通常最容易通过使用DLLMain的DLL\u进程\u连接情况来实现
switch(fdreason)
语句。

是,只需在DLL\u进程中初始化,然后在DLL\u进程中附加和删除

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\u MUTEX\u初始值设定项
在封面下所做的。”

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


您可以通过。--@雷蒙德琴


早期版本中的另一种可能性是指示链接器将指向初始化函数的指针设置为用户定义的全局初始值设定项。这里有一些关于这方面的讨论:

以下是一个例子:

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;

如果不使用DllMain,在普通的旧C中是不可能的。您可以使用
InitOnceExecuteOnce
在第一次使用时初始化关键部分。这就是
PTHREAD\u MUTEX\u初始值设定项
在封面下所做的。哇,来自Raymond Chen的回答。谢谢这正是我想要的。@raymond chen re“PTHREAD_MUTEX_INITIALIZER在封面下所做的”你指的是某个特定的PTHREAD库实现吗?@TimLovell Smith我不知道我写这篇文章时在想什么。行不通。正如我所说的,解决方案不需要初始化功能,如DllMain或类似功能。原因是如果库被静态链接,这样的初始化函数就不会被调用。我想对于早期版本的Windows没有好的解决方案,对吧?很可能没有,或者最好立即说新旧版本没有好的解决方案。您可以通过对旧版本的Windows执行此操作。@MartinSustrik:如果答案是从其他人的评论中获取的,则通常以“社区维基”的形式输入答案。