SetCriticalSectionSpinCount 函数 (synchapi.h)

设置指定临界节的旋转计数。 旋转意味着当线程尝试获取锁定的关键部分时,线程进入循环,检查是否释放锁,如果锁未释放,线程将进入睡眠状态。

语法

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

参数

[in, out] lpCriticalSection

指向关键节对象的指针。

[in] dwSpinCount

关键部分对象的旋转计数。 在单处理器系统上,将忽略旋转计数,并将关键部分旋转计数设置为零 (0) 。 在多处理器系统上,如果关键节不可用,则调用线程在对与关键部分关联的信号灯执行等待操作之前,将旋转 dwSpinCount 次。 如果关键部分在旋转操作期间变为空闲,调用线程将避免等待操作。

返回值

函数返回关键节的上一个旋转计数。

注解

单个进程的线程可以使用关键节对象进行互斥同步。 进程负责分配关键节对象使用的内存,可以通过声明 CRITICAL_SECTION类型的变量来执行此操作。 在使用关键节之前,进程的某个线程必须调用 InitializeCriticalSectionInitializeCriticalSectionAndSpinCount 函数来初始化对象。 随后可以通过调用 SetCriticalSectionSpinCount 函数来修改旋转计数。

旋转计数对于持续时间短的关键部分非常有用,这些部分可能会经历高级别的争用。 请考虑最坏的情况,即 SMP 系统上的应用程序有两个或三个线程不断分配和释放堆中的内存。 应用程序使用关键部分序列化堆。 在最坏的情况下,关键节的争用是恒定的,并且每个线程都会对 WaitForSingleObject 函数进行处理密集型调用。 但是,如果正确设置了旋转计数,则调用线程不会在发生争用时立即调用 WaitForSingleObject 。 相反,如果关键节在旋转操作期间释放,调用线程可以获取该节的所有权。

可以通过为持续时间较短的关键部分选择较小的旋转计数来显著提高性能。 堆管理器对其每个堆关键部分使用大约 4000 个旋转计数。 这在几乎所有最坏情况下都提供了出色的性能和可伸缩性。

若要编译使用此函数的应用程序, 请将 _WIN32_WINNT 定义为 0x0403 或更高版本。 有关详细信息,请参阅 使用 Windows 标头

要求

要求
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 synchapi.h (包括 Windows Server 2003 上的 Windows.h、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

关键节对象

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

WaitForSingleObject

同步函数

VBS enclave 中可用的 Vertdll API