#многопоточность #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). Тогда при раскрутке стека критическая секция будет освобождена.
Комментариев нет:
Отправить комментарий