#многопоточность #cpp #исключения
Корректен ли код? bool started_cs = false; try { // ... EnterCriticalSection(&cs); started_cs = true; // ... LeaveCriticalSection(&cs); started_cs = false; } catch(SomeException&) { if (started_cs) LeaveCriticalSection(&cs); // ... }
Ответы
Ответ 1
Код вполне корректен, но я бы посоветовал отказаться от переменных типа бул для синхронизации. Вы можете сделать, к примеру, так: try { // ... try { EnterCriticalSection(&cs); // ... LeaveCriticalSection(&cs); } catch(...) { // Ловим все исключения... LeaveCriticalSection(&cs); throw; // ...и пробрасываем их дальше. } // ... } catch(SomeException&) { // ... } А вообще, лучше сделать умную критическую секцию. Создать объект, в конструкторе вызвать EnterCriticalSection(&cs), а в деструкторе LeaveCriticalSection(&cs). Тогда при раскрутке стека критическая секция будет освобождена.
Комментариев нет:
Отправить комментарий