enterCriticalSection 函数 (synchapi.h)

等待指定关键部分对象的所有权。 此函数将在授予调用线程所有权时返回。

语法

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

参数

[in, out] lpCriticalSection

指向关键节对象的指针。

返回值

此函数不返回值。

如果关键节上的等待操作超时,此函数可能会引发 EXCEPTION_POSSIBLE_DEADLOCK(也称为 STATUS_POSSIBLE_DEADLOCK)。超时间隔由以下注册表值指定: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout。 不处理可能的死锁异常;而是调试应用程序。

注解

单个进程的线程可以使用关键节对象进行互斥同步。 进程负责分配关键节对象使用的内存,它可以通过声明 类型为 CRITICAL_SECTION 的变量来执行此操作。 在使用关键部分之前,进程的某个线程必须调用 InitializeCriticalSectionInitializeCriticalSectionAndSpinCount 来初始化对象。

为了启用对共享资源的互斥访问,每个线程都会调用 EnterCriticalSectionTryEnterCriticalSection 函数,以请求关键节的所有权,然后再执行访问受保护资源的任何代码部分。 区别在于 ,TryEnterCriticalSection 会立即返回,无论它是否获得了关键节的所有权,而 EnterCriticalSection 会阻止,直到线程可以获取关键节的所有权。 完成执行受保护代码后,线程使用 LeaveCriticalSection 函数放弃所有权,使另一个线程成为所有者并访问受保护的资源。 无法保证等待线程获取关键节所有权的顺序。

线程拥有关键节的所有权后,它可以对 EnterCriticalSectionTryEnterCriticalSection 进行其他调用,而不会阻止其执行。 这可以防止线程在等待它已拥有的关键部分时自行死锁。 每次 EnterCriticalSectionTryEnterCriticalSection 成功时,线程都会进入关键部分。 每次进入关键部分时,线程都必须调用 LeaveCriticalSection 一次。

进程的任何线程都可以使用 DeleteCriticalSection 函数释放在初始化关键节对象时分配的系统资源。 调用此函数后,关键节对象不能再用于同步。

如果线程在拥有关键节的所有权时终止,则关键节的状态是不确定的。

如果在关键节仍归其所有的情况下被删除,则等待已删除的关键节所有权的线程的状态是不确定的。

当进程退出时,如果调用 EnterCriticalSection 会阻止,它将立即终止进程。 这可能会导致不调用全局析构函数。

示例

有关使用 EnterCriticalSection 的示例,请参阅 使用关键节对象

要求

   
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 synchapi.h (包括 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

关键节对象

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

同步函数

TryEnterCriticalSection

VBS enclave 中可用的 Vertdll API