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