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.h、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