Правильность вашего шаблона взаимного исключения зависит от присваивания _flag = false, являющегося атомным. Представьте, что произойдет, если назначение может быть прервано другим потоком. Если промежуточные результаты назначения могут быть интерпретированы тестом как ложные, одно назначение может привести к тому, что несколько потоков попадут в критическую секцию.
Правильность шаблона взаимного исключения также зависит от отсутствия оптимизаций в компиляторе, которые могут изменить порядок операторов. Представьте себе «умный» компилятор, который будет перемещать присваивание _flag = false вверх, потому что _flag не упоминается в промежуточном коде (а промежуточный код не генерирует исключения). Затем компилятор может оптимизировать часть в секции блокировки так, чтобы она прочитала
if(_flag) return;
Оба примера того, почему шаблон может потерпеть неудачу, весьма умозрительны, и я думаю, что вы уверены, что он работает. Однако, при наличии другой опции, которая работает как требуется, вам лучше использовать ее (см. Другие посты). Если в том же коде есть другие разработчики, им не нужно учитывать, работает ли шаблон.