Функция EnterCriticalSection


Функция 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

Нет

Замечания по платформе

Не имеется


Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz