Функция SetCriticalSectionSpinCount (synchapi.h)
Задает счетчик спинов для указанного критического раздела. Вращение означает, что при попытке получить критический раздел, который заблокирован, поток переходит в цикл, проверяет, снята ли блокировка, и если блокировка не снята, поток переходит в спящий режим.
Синтаксис
DWORD SetCriticalSectionSpinCount(
[in, out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount
);
Параметры
[in, out] lpCriticalSection
Указатель на объект критического раздела.
[in] dwSpinCount
Счетчик прокруток для объекта критической секции. В однопроцессорных системах счетчик спинов игнорируется, а число спинов критических разделов равно нулю (0). В многопроцессорных системах, если критический раздел недоступен, вызывающий поток запускает dwSpinCount перед выполнением операции ожидания с семафора, связанного с критическим разделом. Если критический раздел становится свободным во время операции вращения, вызывающий поток избегает операции ожидания.
Возвращаемое значение
Функция возвращает предыдущее число спинов для критического раздела.
Комментарии
Потоки одного процесса могут использовать объект критического раздела для синхронизации с взаимным исключением. Этот процесс отвечает за выделение памяти, используемой объектом критического раздела, что можно сделать, объявив переменную типа CRITICAL_SECTION. Перед использованием критического раздела некоторый поток процесса должен вызвать функцию InitializeCriticalSection или InitializeCriticalSectionAndSpinCount для инициализации объекта. Впоследствии можно изменить счетчик спинов, вызвав функцию SetCriticalSectionSpinCount .
Счетчик спинов полезен для критических периодов короткой длительности, в которые могут возникать высокие уровни состязания. Рассмотрим наихудший сценарий, в котором приложение в системе SMP имеет два или три потока, постоянно выделяющие и освобождающие память из кучи. Приложение сериализует кучу с критическим разделом. В худшем случае состязание за критический раздел является постоянным, и каждый поток выполняет ресурсоемкий вызов функции WaitForSingleObject . Однако если счетчик спинов задан правильно, вызывающий поток не сразу вызывает WaitForSingleObject при возникновении конфликта. Вместо этого вызывающий поток может получить право владения критически важным разделом, если он освобождается во время операции вращения.
Вы можете значительно повысить производительность, выбрав небольшое число спинов для критического участка короткой длительности. Диспетчер кучи использует счетчик спина примерно 4000 для критических разделов кучи. Это обеспечивает высокую производительность и масштабируемость почти во всех наихудших сценариях.
Чтобы скомпилировать приложение, использующее эту функцию, определите _WIN32_WINNT как 0x0403
или более поздней версии. Дополнительные сведения см. в разделе Использование заголовков Windows.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | 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 |