После того, как заглянул в реализацию, сам разобрался с ответом.
Когда InitializeCriticalSectionEx
используется с ненулевым счетчиком спинов, флаг RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN
не устанавливается.Таким образом, этот код выводит 00000001
:
::InitializeCriticalSectionEx(&cs, 1, 0);
printf("Spin count after explicit one %08X\n", cs.SpinCount);
::DeleteCriticalSection(&cs);
Один счетчик спинов почти равен нулю.И, кроме того, при вызове SetCriticalSectionSpinCount
впоследствии его можно сбросить на ноль.Таким образом, этот код выводит 00000000
:
::InitializeCriticalSectionEx(&cs, 1, 0);
::SetCriticalSectionSpinCount(&cs, 0);
printf("Spin count after explicit one and then reset to zero %08X\n", cs.SpinCount);
::DeleteCriticalSection(&cs);
Конечно, должна быть веская причина отключить вращение.По умолчанию, как указал @JonathanPotter, спиннинг хорош.В противном случае это не было бы установлено как поведение по умолчанию.Поэтому я даже не применил решение для отключения вращения к своей исходной задаче.
С другой стороны, сопровождающие критической секции не могут не уважать счетчик нулевого вращения, переданный в InitializeCriticalSectionEx
, илиInitializeCriticalSectionAndSpinCount
.Они просто убедились, что обычный InitializeCriticalSection
получает автоматический счетчик спинов.