Функция 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
Header synchapi.h (включая Windows.h в Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

Критически важные объекты раздела

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

Функции синхронизации

TryEnterCriticalSection

API-интерфейсы Vertdll, доступные в анклавах VBS