Добавленный код выделен. Хочется пояснить одну деталь:
так как изменять значение переменной value можно несколько раз, а Commit (или
Rollback) вызывать только раз, налицо тот факт, что функция
EnterCriticalSection вызывается бОльшее количество раз, нежели LeaveCriticalSection.
Это ошибка – в соответствии с документацией количество вызовов функций
EnterCriticalSection и LeaveCriticalSection должно совпадать. Поэтому после
входа в критическую секцию я проверяю поле RecursionCount, которое
устанавливает количество повторных входов потока в критическую секцию.
ПРИМЕЧАНИЕ
При работе под ОС семейства Windows 9x
это поле не используется и всегда содержит 0, так что приводимый здесь и
далее код будет работать только на операционных системах семейства NT.
Теперь можно определенно сказать, что выведется на
консоль в следующем примере: