I'm trying to set spin count for CRITICAL_SECTION to zero by different methods:
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);
}
In Windows 7, all results are 0 as expected.
In Windows 10, except the last one, all result in 0x020007D0 value. The last one result in 0x02000000.
Apparently, 0x07D0 is actual spin count (2000 in decimal), and 0x02000000 is one of these flags:
#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
I'm afraid that RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN may cause critical section to spin even if I asked it not to spin by using SetCriticalSectionSpinCount.
Is there any way not to define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN by using standard documented APIs ?