InterlockedIncrement vs EnterCriticalSection / counter ++ / LeaveCriticalSection

У меня есть некоторый многопоточный код (см. Вопрос Простой пример пула потоков Windows API ), для которого я использую счетчик для идентификации потока.

Мне посоветовали использовать InterlockedIncrement для увеличения этого счетчика в функции обратного вызова потока. Однако это не помогло правильно заблокировать переменную, так как я столкнулся с некоторыми проблемами параллелизма. Я заменил InterlockedIncrement, используя вручную критический раздел: EnterCriticalSection / counter ++ / LeaveCriticalSection, и теперь он отлично работает.

Почему так? Разве эти два варианта не должны быть строго эквивалентными? Обратите внимание, что я говорю о запуске всего пары (около 10) потоков.

5
задан Community 23 May 2017 в 12:22
поделиться