Функция EnterCriticalSection ждет монопольное использование указанного объекта критической секции. Функция возвращает значение тогда , когда вызывающему потоку предоставляют монопольное использование.
Синтаксис
VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection // критическая секция ); |
Параметры
lpCriticalSection
[in/out] Указатель на объект критической секции.Возвращаемые значения
Эта функция не возвращает значение.
Windows 2000 и ранее: В ситуациях нехватки памяти, функция EnterCriticalSection может спровацировать исключительную ситуацию. Чтобы избежать проблем, используйте структурную обработку исключений или вызовите функцию InitializeCriticalSectionAndSpinCount, чтобы предназначить событие, используемое EnterCriticalSection вместо вызова функции InitializeCriticalSection, чтобы заставить EnterCriticalSection, назначить событие.
Замечания
Потоки отдельно взятого процесса могут использовать объект критической секции для синхронизации взаимоблокировки. Процесс несет ответственность за распределение памяти, используемой объектом критической секции, который это может сделать, объявляя переменную типа CRITICAL_SECTION. Перед использованием критической секции, некий поток процесса должен вызвать функцию InitializeCriticalSection или InitializeCriticalSectionAndSpinCount, чтобы инициализировать объект.
Чтобы включить в работу взаимоисключающий доступ к совместно используемому ресурсу, каждый поток вызывает функцию EnterCriticalSection или TryEnterCriticalSection, чтобы запросить монопольное использование критической секции перед выполнением какой-либо части кода, который получает доступ к защищенному ресурсу. Различие в том, что функция TryEnterCriticalSection возвращает значение немедленно, независимо от того, получил или нет поток в монопольное использование критическую секцию, в то время как функция EnterCriticalSection блокирует до тех пор, пока поток не сможет взять в монопольное использование критическую секцию. Когда поток закончит исполнять защищенный код, он использует функцию LeaveCriticalSection, чтобы освободить монопольное использование, давая возможность другому потоку стать монопольным пользователем и получить доступ к защищенному ресурсу. Поток должен вызывать LeaveCriticalSection в этой связи каждый раз, когда он входит в критическую секцию. Поток входит в критическую секцию каждый раз, когда функции EnterCriticalSection и TryEnterCriticalSection завершаются успешно.
После того, как поток получит в монопольное использование критическую секцию, он может делать дополнительные вызовы функций EnterCriticalSection или TryEnterCriticalSection, не блокируя исполнение своего кода. Это предохраняет поток от самоблокировки во время ожидания критической секции, которой он уже владеет.
Любой поток процесса может использовать функцию DeleteCriticalSection, чтобы освободить системные ресурсы, которые были распределены, когда объект критической секции был инициализирован. После того, как эта функция вызвалась, объект критической секции больше не может использоваться для синхронизации.
Если работа потока завершается в то время, когда он имеет в монопольном использовании критическую секцию, состояние критической секции - неопределеное.
Если критическая секция удаляется, в то время, когда она все еще находится в монопольном использовании, состояние потоков, ожидающих монопольного использования удаленной критической секции становится неопределеным.
Код примера
Пример, который использует функцию EnterCriticalSection, смотрите в статье Использование объектов критической секции.
Смотри также
Краткий обзор Синхронизация, Функции, используемые синхронизацией, DeleteCriticalSection, InitializeCriticalSection, InitializeCriticalSectionAndSpinCount, LeaveCriticalSection, TryEnterCriticalSection
Размещение и совместимость EnterCriticalSection |
|
Windows. NET Server |
Да |
Windows XP |
Да |
Windows 2000 |
Да |
Windows NT |
Да версии 3.1 и выше |
Windows Me |
Да |
Windows 98 |
Да |
Windows 95 |
Да |
Используемая библиотека |
Kernel32.lib |
Заголовочный файл |
|
- объявлено в |
Winbase.h |
- включено в |
Windows.h |
Unicode |
Нет |
Замечания по платформе |
Не имеется |