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类型的变量来执行此操作。 在使用关键节之前,进程的某个线程必须调用 InitializeCriticalSection 或 InitializeCriticalSectionAndSpinCount 来初始化对象。
为了启用对共享资源的互斥访问,每个线程调用 EnterCriticalSection 或 TryEnterCriticalSection 函数,以在执行访问受保护资源的任何代码部分之前请求关键节的所有权。 区别在于,无论它是否获得了关键节的所有权, TryEnterCriticalSection 都会立即返回,而 EnterCriticalSection 将阻止,直到线程可以获取关键节的所有权。 完成执行受保护的代码后,线程将使用 LeaveCriticalSection 函数放弃所有权,使另一个线程成为所有者并访问受保护的资源。 无法保证等待线程获取关键节所有权的顺序。
线程拥有关键节的所有权后,它可以对 EnterCriticalSection 或 TryEnterCriticalSection 进行其他调用,而不会阻止其执行。 这可以防止线程在等待它已拥有的关键节时自行死锁。 每次 EnterCriticalSection 和 TryEnterCriticalSection 成功时,线程都会进入关键部分。 每次进入关键部分时,线程都必须调用 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 |