Расширяя ответ sbi (как вы говорите, вы новичок в C ++), исключение игнорирует остальную часть кода с того места, где он вызывается, пока не достигнет места, где может быть обработано исключение («зацепка»). ) - единственное исключение - когда исключение оборачивает память в стеке - оно вызывает деструкторы переменных стека.
Чтобы гарантировать, что всегда вызывается 'Leave', используйте следующий класс: (извините за отсутствие форматирования) и поместите экземпляр этого класса и критический код в новый стек. Это гарантирует, что 'Leave' всегда вызывается, как в сценариях не исключений, так и исключений.
edit: Обновление кода p-o-c для отражения комментария.
class AutoCritical
{
public:
AutoCritical(CritSec * p_CritSec) : m_Sec(p_CritSec)
{ EnterCriticalSection(m_CritSec); };
~AutoCritical() { LeaveCriticalSection(m_CritSec); };
private:
CritSec * m_Sec;
};
место вызова:
// non-critical code ....
{ //open stack for critical code
AutoCritical a(&critsec[x]);
// do critical stuff here ...
} // close stack