我试图为CRITICAL_SECTION旋转数设置为不同的方法零:
int main()
{
CRITICAL_SECTION cs;
::InitializeCriticalSection(&cs);
printf("Spin count by default %08X\n", cs.SpinCount);
::DeleteCriticalSection(&cs);
::InitializeCriticalSectionAndSpinCount(&cs, 0);
printf("Spin count with zero spin count init %08X\n", cs.SpinCount );
::DeleteCriticalSection(&cs);
::InitializeCriticalSectionEx(&cs, 0, 0);
printf("Spin count with zero spin count and flags init %08X\n", cs.SpinCount );
::DeleteCriticalSection(&cs);
::InitializeCriticalSection(&cs);
::SetCriticalSectionSpinCount(&cs, 0);
printf("Spin count after explicit reset to zero %08X\n", cs.SpinCount);
::DeleteCriticalSection(&cs);
}
在Windows 7中 ,所有的结果都是0预期。
在Windows 10,除了最后一个,所有的结果0x020007D0
价值。 最后一个结果0x02000000
。
显然, 0x07D0
是实际旋转数( 2000
十进制),而0x02000000
是这些标志之一:
#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO 0x01000000
#define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN 0x02000000
#define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT 0x04000000
#define RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE 0x08000000
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO 0x10000000
恐怕RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN
可能会导致如果我问它不是通过使用旋转关键部分,甚至旋转SetCriticalSectionSpinCount
。
有什么办法没有定义RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN
使用标准记录的API?