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


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

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

Синтаксис

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

Параметры

[out] lpCriticalSection

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

[in] dwSpinCount

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

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

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

Windows Server 2003 и Windows XP: Если функция выполняется успешно, возвращается ненулевое значение. Если функция завершается сбоем, возвращаемое значение равно нулю 0. Дополнительные сведения об ошибке можно получить, вызвав GetLastError. Начиная с Windows Vista функция InitializeCriticalSectionAndSpinCount всегда выполняется успешно, даже при нехватке памяти.

Комментарии

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

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

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

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

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

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

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

Чтобы скомпилировать приложение, использующее эту функцию, определите _WIN32_WINNT как 0x0403 или более поздней версии. Дополнительные сведения см. в разделе Использование заголовков Windows.

Примеры

Пример использования InitializeCriticalSectionAndSpinCount см. в разделе Использование объектов критического раздела.

Требования

   
Минимальная версия клиента 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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

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

WaitForSingleObject

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