Поделиться через


Функция InitializeCriticalSectionEx (synchapi.h)

Инициализирует объект критического раздела с числом спинов и необязательными флагами.

Синтаксис

BOOL InitializeCriticalSectionEx(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount,
  [in]  DWORD              Flags
);

Параметры

[out] lpCriticalSection

Указатель на объект критического раздела.

[in] dwSpinCount

Счетчик прокруток для объекта критической секции. В однопроцессорных системах счетчик спинов игнорируется, а для критического числа спинов секций задано значение 0 (ноль). В многопроцессорных системах, если критический раздел недоступен, вызывающий поток запускает dwSpinCount перед выполнением операции ожидания с семафора, связанного с критическим разделом. Если критический раздел становится свободным во время операции вращения, вызывающий поток избегает операции ожидания.

[in] Flags

Этот параметр может иметь значение 0 или следующее значение.

Значение Значение
CRITICAL_SECTION_NO_DEBUG_INFO Критический раздел создается без отладочной информации.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция завершается ошибкой, возвращаемое значение равно нулю (0). Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Потоки одного процесса могут использовать объект критического раздела для синхронизации с взаимным исключением. Нет никакой гарантии в порядке, в соответствии с которым потоки получают права владения критически важным разделом, однако система является справедливой для всех потоков.

Этот процесс отвечает за выделение памяти, используемой объектом критического раздела, что можно сделать, объявив переменную типа CRITICAL_SECTION. Перед использованием критического раздела некоторый поток процесса должен инициализировать объект . Впоследствии можно изменить счетчик спинов, вызвав функцию SetCriticalSectionSpinCount .

После инициализации объекта критического раздела потоки процесса могут указать объект в функциях EnterCriticalSection, TryEnterCriticalSection или LeaveCriticalSection , чтобы обеспечить взаимоисключающий доступ к общему ресурсу. Для аналогичной синхронизации между потоками разных процессов используйте объект мьютекса.

Объект критического раздела нельзя переместить или скопировать. Процесс также не должен изменять объект , но должен рассматривать его как логически непрозрачный. Используйте только функции критического раздела для управления объектами критических разделов. Завершив работу с критическим разделом, вызовите функцию DeleteCriticalSection .

Перед повторной инициализацией объекта критического раздела необходимо удалить. Инициализация критического раздела, который уже инициализирован, приводит к неопределенному поведению.

Счетчик спинов полезен для критических периодов короткой длительности, в которые могут возникать высокие уровни состязания. Рассмотрим наихудший сценарий, в котором приложение в системе SMP имеет два или три потока, постоянно выделяющие и освобождающие память из кучи. Приложение сериализует кучу с критическим разделом. В худшем случае состязание за критический раздел является постоянным, и каждый поток выполняет ресурсоемкий вызов функции WaitForSingleObject . Однако если счетчик спинов задан правильно, вызывающий поток не сразу вызывает WaitForSingleObject при возникновении конфликта. Вместо этого вызывающий поток может получить право владения критически важным разделом, если он освобождается во время операции вращения.

Вы можете значительно повысить производительность, выбрав небольшое число спинов для критического участка короткой длительности. Диспетчер кучи использует счетчик спина примерно 4000 для критических разделов кучи. Это обеспечивает высокую производительность и масштабируемость почти во всех наихудших сценариях.

Требования

Требование Значение
Минимальная версия клиента Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2008 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header synchapi.h (включает Windows.h в Windows 7, Windows Server 2008 Windows Server 2008 R2)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

Объекты критического раздела

DeleteCriticalSection

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