Я не совсем понимаю документацию для InitializeCriticalSectionAndSpinCount: http://msdn.microsoft.com/en-us/library/windows/desktop/ms683476(v=vs.85).aspx
В нем говорится: «Вы можете значительно улучшить производительность, выбрав небольшое количество вращений ...»
Однако, поскольку ожидание счетчика выполняется быстрее, чем ожидание объекта, не имеет ли смысла иметь максимально возможное значение SpinCount? Что мне не хватает? Спасибо.
(Я использую его внутри C DLL, используемого многопоточным приложением)
Вот код критической секции, постоянно вызываемой большим количеством потоков:
int g_slots[256] = {0};
...
slot = 256;
EnterCriticalSection(&g_LockHandle);
while (slot-- > 0)
{
if (g_slots[slot] == 0)
{
g_slots[slot] = spid;
break;
}
}
LeaveCriticalSection(&g_LockHandle);
Последующие комментарии:
Для всех, кто заинтересован, вот мои неофициальные результаты тестирования на 4-ядерном сервере под управлением Windows 2008 R2: при выполнении сверхбыстрой операции, такой как проверка и увеличение одной переменной, Interlocked выигрывает безоговорочно. На втором месте находится CriticalSection+SpinCount с низким количеством вращений (например, 16), за которым следует старая добрая CriticalSection. Однако при сканировании массива (например, целых чисел) Interlocked занимает третье место после CriticalSection (со счетчиком SpinCount или без него). CriticalSection+high SpinCount был самым медленным во всех случаях.
Нил Вейхер www.netlib.com