Используйте критическую секцию (InitializeCriticalSection (), EnterCriticalSection (), LeaveCriticalSection ()), а также реализуйте счетчик записей. Критическая секция защищает от повторного входа из разных потоков, а счетчик входа защищает от повторного входа из одного потока.
Для реализации счетчика записей используйте общую переменную (логическое для вашего случая) и класс скобок. Как только вы уже вошли в критическую секцию (и, следовательно, никакой другой поток не будет выполнять тот же код параллельно), проверьте значение переменной. Если говорится, что функция уже введена - выйдите (сначала отпустите критическую секцию, затем выйдите из функции). В противном случае создайте свой экземпляр класса скобок, который изменит значение переменной. Поэтому, когда в следующий раз этот поток войдет в функцию, он проверит переменную, увидит, что повторный вход произошел, и уйдет. Деструктор класса скобок изменит переменную на ее первоначальное значение после выхода из функции.
Целесообразно использовать скобочные классы как для входа в критическую секцию, так и для изменения счетчика записей, чтобы ваш код был безопасным для исключений, и все действия выполнялись в необходимом порядке и независимо от того, как вы выходите из функции - по исключению или по возвращении заявление.